/ Hex Artifact Content
Login

Artifact 4bdfccf93a33453b427fb01cf12dfe26a5dd2cbc:


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 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
47a0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
47b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
47c0: 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52  TE_OMIT_CODEC_FR
47d0: 4f 4d 5f 54 43 4c 29 0a 20 20 73 71 6c 69 74 65  OM_TCL).  sqlite
47e0: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
47f0: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74  har *zKey;.  int
4800: 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67   nKey;.  if( arg
4810: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
4820: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4830: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4840: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
4850: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
4860: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
4870: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4890: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
48a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
48b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
48c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
48d0: 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Key = argv[2];. 
48e0: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
48f0: 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Key);.  sqlite3_
4900: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
4910: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ey);.#endif.  re
4920: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4930: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4940: 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b  lite3_rekey DB K
4950: 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  EY.**.** Change 
4960: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
4970: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4980: 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20  t_rekey(.  void 
4990: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
49a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
49b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
49c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
49d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
49e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
49f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4a00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4a10: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
4a20: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
4a30: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4a40: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4a50: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
4a60: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
4a70: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
4a80: 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
4a90: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61  nt nKey;.  if( a
4aa0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
4ab0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4ac0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4ad0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4ae0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4af0: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
4b00: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4b10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4b20: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
4b30: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
4b40: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
4b50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4b60: 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b   zKey = argv[2];
4b70: 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e  .  nKey = strlen
4b80: 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  (zKey);.  sqlite
4b90: 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79  3_rekey(db, zKey
4ba0: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
4bb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
4bd0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
4be0: 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20  DB.**.** Closes 
4bf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
4c00: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f  ned by sqlite3_o
4c10: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
4c20: 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  nt sqlite_test_c
4c30: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  lose(.  void *No
4c40: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4c50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4c60: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4c70: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4c80: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4c90: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cb0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4cc0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4cd0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4ce0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4cf0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4d00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4d10: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
4d20: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4d30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4d40: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4d50: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4d60: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4d70: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
4d80: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4d90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4da0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4db0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
4dc0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
4dd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4de0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
4df0: 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  se(db);.  Tcl_Se
4e00: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
4e10: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
4e20: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
4e30: 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
4e40: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
4e50: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4e60: 63 6c 6f 73 65 5f 76 32 20 44 42 0a 2a 2a 0a 2a  close_v2 DB.**.*
4e70: 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74  * Closes the dat
4e80: 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
4e90: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f  sqlite3_open..*/
4ea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4eb0: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32  te_test_close_v2
4ec0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4ed0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4ee0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4ef0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4f00: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4f10: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4f20: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4f40: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4f50: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4f70: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4f80: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
4f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
4fa0: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
4fb0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
4fc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4fd0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4fe0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4ff0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
5000: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
5010: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5020: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
5030: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
5040: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
5050: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
5060: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
5070: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
5080: 32 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  2(db);.  Tcl_Set
5090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
50a0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
50b0: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
50c0: 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
50d0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  L_OK;.}../*.** I
50e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
50f0: 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28   the x_coalesce(
5100: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52  ) function..** R
5110: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
5120: 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c  argument non-NUL
5130: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  L argument..*/.s
5140: 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69 66  tatic void t1_if
5150: 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  nullFunc(.  sqli
5160: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5170: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5180: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5190: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
51a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
51b0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
51c0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
51d0: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
51e0: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29  _type(argv[i]) )
51f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
5200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5210: 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  tes(argv[i]);.  
5220: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5230: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
5240: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
5250: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5260: 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  i]),.          n
5270: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5280: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
5290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
52a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
52b0: 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  est functions.  
52c0: 20 20 68 65 78 38 28 29 20 69 6e 74 65 72 70 72    hex8() interpr
52d0: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
52e0: 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64 20   as.** UTF8 and 
52f0: 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e  returns a hex en
5300: 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c 65  coding.  hex16le
5310: 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74  () interprets it
5320: 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 73  s argument.** as
5330: 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65 74   UTF16le and ret
5340: 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64  urns a hex encod
5350: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5360: 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73 71 6c  oid hex8Func(sql
5370: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c  ite3_context *p,
5380: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5390: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
53a0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
53b0: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  ed char *z;.  in
53c0: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
53d0: 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c  [200];.  z = sql
53e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
53f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
5400: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
5410: 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b 69  uf)/2 - 2 && z[i
5420: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5430: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5440: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 32 2c 20  zeof(zBuf)-i*2, 
5450: 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32  &zBuf[i*2], "%02
5460: 78 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 20  x", z[i]);.  }. 
5470: 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a   zBuf[i*2] = 0;.
5480: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5490: 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29  _text(p, (char*)
54a0: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
54b0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23  _TRANSIENT);.}.#
54c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
54d0: 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
54e0: 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28 73  void hex16Func(s
54f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5500: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5510: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5520: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5530: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a  gned short int *
5540: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5550: 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20  ar zBuf[400];.  
5560: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5570: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
5580: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5590: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d  sizeof(zBuf)/4 -
55a0: 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29   4 && z[i]; i++)
55b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
55c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
55d0: 75 66 29 2d 69 2a 34 2c 20 26 7a 42 75 66 5b 69  uf)-i*4, &zBuf[i
55e0: 2a 34 5d 2c 22 25 30 34 78 22 2c 20 7a 5b 69 5d  *4],"%04x", z[i]
55f0: 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42  &0xff);.  }.  zB
5600: 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20 73  uf[i*4] = 0;.  s
5610: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5620: 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75  xt(p, (char*)zBu
5630: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
5640: 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64  ANSIENT);.}.#end
5650: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  if../*.** A stru
5660: 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63 68  cture into which
5670: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 74   to accumulate t
5680: 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64  ext..*/.struct d
5690: 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c  str {.  int nAll
56a0: 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61 6c  oc;  /* Space al
56b0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
56c0: 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70 61   nUsed;   /* Spa
56d0: 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  ce used */.  cha
56e0: 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65  r *z;     /* The
56f0: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
5700: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
5710: 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61  to a dstr.*/.sta
5720: 74 69 63 20 76 6f 69 64 20 64 73 74 72 41 70 70  tic void dstrApp
5730: 65 6e 64 28 73 74 72 75 63 74 20 64 73 74 72 20  end(struct dstr 
5740: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5750: 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29 7b  z, int divider){
5760: 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
5770: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28  strlen(z);.  if(
5780: 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b 20   p->nUsed + n + 
5790: 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  2 > p->nAlloc ){
57a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  .    char *zNew;
57b0: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d  .    p->nAlloc =
57c0: 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e   p->nAlloc*2 + n
57d0: 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65 77   + 200;.    zNew
57e0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
57f0: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
5800: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  oc);.    if( zNe
5810: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
5820: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29  lite3_free(p->z)
5830: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
5840: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
5850: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
5860: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d      }.    p->z =
5870: 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   zNew;.  }.  if(
5880: 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e   divider && p->n
5890: 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d  Used>0 ){.    p-
58a0: 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  >z[p->nUsed++] =
58b0: 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20   divider;.  }.  
58c0: 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e  memcpy(&p->z[p->
58d0: 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b  nUsed], z, n+1);
58e0: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e  .  p->nUsed += n
58f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5900: 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ed for each call
5910: 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65  back from sqlite
5920: 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61  3ExecFunc.*/.sta
5930: 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63  tic int execFunc
5940: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
5950: 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20  Data, int argc, 
5960: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61  char **argv, cha
5970: 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  r **NotUsed){.  
5980: 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d  struct dstr *p =
5990: 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29 70   (struct dstr*)p
59a0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
59b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
59c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
59d0: 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  argv[i]==0 ){.  
59e0: 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70      dstrAppend(p
59f0: 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a  , "NULL", ' ');.
5a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5a10: 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61   dstrAppend(p, a
5a20: 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20  rgv[i], ' ');.  
5a30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5a40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   0;.}../*.** Imp
5a50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
5a60: 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  he x_sqlite_exec
5a70: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
5a80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  is function take
5a90: 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72  s.** a single ar
5aa0: 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d  gument and attem
5ab0: 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20 74  pts to execute t
5ac0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20  hat argument as 
5ad0: 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69  SQL code..** Thi
5ae0: 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64  s is illegal and
5af0: 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20   should set the 
5b00: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c  SQLITE_MISUSE fl
5b10: 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ag on the databa
5b20: 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  se..**.** 2004-J
5b30: 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20  an-07:  We have 
5b40: 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20  changed this to 
5b50: 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f  make it legal to
5b60: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78   call sqlite3_ex
5b70: 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74  ec().** from wit
5b80: 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  hin a function c
5b90: 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68  all.  .** .** Th
5ba0: 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c  is routine simul
5bb0: 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74 20  ates the effect 
5bc0: 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68  of having two th
5bd0: 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f  reads attempt to
5be0: 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65  .** use the same
5bf0: 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
5c00: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73   same time..*/.s
5c10: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
5c20: 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71  e3ExecFunc(.  sq
5c30: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5c40: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
5c50: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
5c60: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5c70: 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20 78  .  struct dstr x
5c80: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30  ;.  memset(&x, 0
5c90: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
5ca0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
5cb0: 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71 6c  ec((sqlite3*)sql
5cc0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
5cd0: 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20 28  ontext),.      (
5ce0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5cf0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5d00: 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e  ),.      execFun
5d10: 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30  cCallback, &x, 0
5d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
5d30: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5d40: 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20  , x.z, x.nUsed, 
5d50: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5d60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5d70: 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(x.z);.}../*.**
5d80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5d90: 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28 29  of tkt2213func()
5da0: 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74  , a scalar funct
5db0: 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20 65  ion that takes e
5dc0: 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72  xactly.** one ar
5dd0: 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20 74  gument. It has t
5de0: 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  wo interesting f
5df0: 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a  eatures:.**.** *
5e00: 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65   It calls sqlite
5e10: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20 33  3_value_text() 3
5e20: 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61 72   times on the ar
5e30: 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 76  gument sqlite3_v
5e40: 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20 74  alue*..**   If t
5e50: 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65 72  he three pointer
5e60: 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6e  s returned are n
5e70: 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20 53  ot the same an S
5e80: 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69 73  QL error is rais
5e90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65  ed..**.** * Othe
5ea0: 72 77 69 73 65 20 69 74 20 72 65 74 75 72 6e 73  rwise it returns
5eb0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
5ec0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
5ed0: 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20 20 20  on of its .**   
5ee0: 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63 68  argument in such
5ef0: 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56 44   a way as the VD
5f00: 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  BE representatio
5f10: 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c 6c  n is a Mem* cell
5f20: 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65 20   .**   with the 
5f30: 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63 6c  MEM_Term flag cl
5f40: 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b  ear. .**.** Tick
5f50: 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68 65  et #2213 can the
5f60: 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65 64  refore be tested
5f70: 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20 74   by evaluating t
5f80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
5f90: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a  SQL expression:.
5fa0: 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33 66  **.**   tkt2213f
5fb0: 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63 28  unc(tkt2213func(
5fc0: 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a 2f  'a string'));.*/
5fd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b 74  .static void tkt
5fe0: 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20 20  2213Function(.  
5ff0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6000: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
6010: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
6020: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
6030: 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a  ){.  int nText;.
6040: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6050: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a 20  const *zText1;. 
6060: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
6070: 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20 20  onst *zText2;.  
6080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f  unsigned char co
6090: 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20 20  nst *zText3;..  
60a0: 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  nText = sqlite3_
60b0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
60c0: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20 3d  [0]);.  zText1 =
60d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
60e0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
60f0: 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65 33  zText2 = sqlite3
6100: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6110: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20 3d  [0]);.  zText3 =
6120: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6130: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20  ext(argv[0]);.. 
6140: 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54 65   if( zText1!=zTe
6150: 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d 7a  xt2 || zText2!=z
6160: 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71 6c  Text3 ){.    sql
6170: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6180: 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74 32  r(context, "tkt2
6190: 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65 64  213 is not fixed
61a0: 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
61b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  .    char *zCopy
61c0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
61d0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74 29  e3_malloc(nText)
61e0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
61f0: 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65 78  py, zText1, nTex
6200: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
6210: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6220: 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65 78  ext, zCopy, nTex
6230: 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  t, sqlite3_free)
6240: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6250: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
6260: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
6270: 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  4 arguments.  Th
6280: 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74 68  e 2nd and.** 4th
6290: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
62a0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  e one of these s
62b0: 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27 2c  trings:  'text',
62c0: 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f 72   'text16',.** or
62d0: 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70 6f   'blob' correspo
62e0: 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75 6e  nding to API fun
62f0: 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20  ctions.**.**    
6300: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
6310: 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  text().**      s
6320: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6330: 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  t16().**      sq
6340: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
6350: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69  ().**.** The thi
6360: 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  rd argument is a
6370: 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72 20   string, either 
6380: 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74 65  'bytes' or 'byte
6390: 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a  s16' or 'noop',.
63a0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
63b0: 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20   to APIs:.**.** 
63c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
63d0: 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20 20  ue_bytes().**   
63e0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
63f0: 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20 20  _bytes16().**   
6400: 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68     noop.**.** Th
6410: 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74 65  e APIs designate
6420: 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68 72  d by the 2nd thr
6430: 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65 6e  ough 4th argumen
6440: 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a 2a  ts are applied.*
6450: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  * to the first a
6460: 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  rgument in order
6470: 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74 65  .  If the pointe
6480: 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  rs returned by t
6490: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e 64  he.** second and
64a0: 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66 66   fourth are diff
64b0: 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75 74  erent, this rout
64c0: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20  ine returns 1.  
64d0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68  Otherwise,.** th
64e0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
64f0: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ns 0..**.** This
6500: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
6510: 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65 65  d to test to see
6520: 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20 70   when returned p
6530: 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20  ointers from.** 
6540: 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74 65  the _text(), _te
6550: 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f 62  xt16() and _blob
6560: 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20 69  () APIs become i
6570: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
6580: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43 68  tatic void ptrCh
6590: 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  ngFunction(.  sq
65a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
65b0: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
65c0: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
65d0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
65e0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
65f0: 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74 20  1, *p2;.  const 
6600: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 66  char *zCmd;.  if
6610: 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74 75  ( argc!=4 ) retu
6620: 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f  rn;.  zCmd = (co
6630: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6640: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6650: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[1]);.  if( zCm
6660: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6670: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6680: 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"text")==0 ){. 
6690: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
66a0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
66b0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
66c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
66d0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
66e0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
66f0: 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d  Cmd, "text16")==
6700: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
6710: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
6720: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
6730: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
6740: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6750: 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22  cmp(zCmd, "blob"
6760: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d  )==0 ){.    p1 =
6770: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6780: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
6790: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c  (argv[0]);.  }el
67a0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  se{.    return;.
67b0: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f    }.  zCmd = (co
67c0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
67d0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
67e0: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[2]);.  if( zCm
67f0: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6800: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6810: 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  ,"bytes")==0 ){.
6820: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6830: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
6840: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6850: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
6860: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6870: 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29 3d  Cmd, "bytes16")=
6880: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6890: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
68a0: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
68b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
68c0: 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22  cmp(zCmd, "noop"
68d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 64  )==0 ){.    /* d
68e0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
68f0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6900: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
6910: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6920: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6930: 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[3]);.  if( z
6940: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
6950: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
6960: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
6970: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6980: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6990: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
69a0: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
69b0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
69c0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
69d0: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
69e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
69f0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
6a00: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
6a10: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6a20: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6a30: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
6a40: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32  b")==0 ){.    p2
6a50: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6a60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6a70: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
6a80: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6a90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6aa0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6ab0: 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a  xt, p1!=p2);.}..
6ac0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 53 51 4c 20 66  /*.** This SQL f
6ad0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
6ae0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73 77  a different answ
6af0: 65 72 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  er each time it 
6b00: 69 73 20 63 61 6c 6c 65 64 2c 20 65 76 65 6e 20  is called, even 
6b10: 69 66 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  if.** the argume
6b20: 6e 74 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  nts are the same
6b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b40: 20 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69   nondeterministi
6b50: 63 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  cFunction(.  sql
6b60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6b70: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
6b80: 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  gc,  .  sqlite3_
6b90: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6ba0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
6bb0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
6bc0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6bd0: 78 74 2c 20 63 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f  xt, cnt++);.}../
6be0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
6bf0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6c00: 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  tion DB.**.** Ca
6c10: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
6c20: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
6c30: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
6c40: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
6c50: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
6c60: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
6c70: 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54  "x_coalesce".  T
6c80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
6c90: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
6ca0: 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c  .** as the "coal
6cb0: 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20  esce" function. 
6cc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6cd0: 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e  lso registers an
6ce0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
6cf0: 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65   named "x_sqlite
6d00: 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f  _exec" that invo
6d10: 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63  kes sqlite3_exec
6d20: 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71  ().  Invoking sq
6d30: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
6d40: 69 6e 20 74 68 69 73 20 77 61 79 20 69 73 20 69  in this way is i
6d50: 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e  llegal recursion
6d60: 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73   and should rais
6d70: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  e an SQLITE_MISU
6d80: 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65  SE error..** The
6d90: 20 65 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c   effect is simil
6da0: 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20  ar to trying to 
6db0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6dc0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6dd0: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72   from.** two thr
6de0: 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d 65  eads at the same
6df0: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   time..**.** The
6e00: 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61   original motiva
6e10: 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f  tion for this ro
6e20: 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20  utine was to be 
6e30: 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  able to call the
6e40: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  .** sqlite3_crea
6e50: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  te_function func
6e60: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
6e70: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
6e80: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
6e90: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
6ea0: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
6eb0: 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74  n logic..*/.stat
6ec0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
6ed0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
6ee0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6ef0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6f00: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
6f10: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
6f20: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
6f30: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
6f40: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
6f50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6f60: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6f70: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
6f80: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
6f90: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6fa0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
6fb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
6fc0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
6fd0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6fe0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
6ff0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
7000: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
7010: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
7020: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
7030: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7040: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
7050: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
7060: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
7070: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7080: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7090: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
70a0: 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c  b, "x_coalesce",
70b0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
70c0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74 31  , 0, .        t1
70d0: 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20  _ifnullFunc, 0, 
70e0: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
70f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7100: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7110: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7120: 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49 54  "hex8", 1, SQLIT
7130: 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
7140: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20  DETERMINISTIC,. 
7150: 20 20 20 20 20 20 20 20 20 30 2c 20 68 65 78 38           0, hex8
7160: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
7170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7180: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
7190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
71a0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
71b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
71c0: 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20  on(db, "hex16", 
71d0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  1, SQLITE_UTF16 
71e0: 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
71f0: 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20 20  NISTIC,.        
7200: 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63 2c 20    0, hex16Func, 
7210: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
7220: 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  f.  if( rc==SQLI
7230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
7240: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
7250: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
7260: 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c 20  kt2213func", 1, 
7270: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a  SQLITE_ANY, 0, .
7280: 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32 31            tkt221
7290: 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29  3Function, 0, 0)
72a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
72b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
72c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
72d0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
72e0: 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67  , "pointer_chang
72f0: 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e  e", 4, SQLITE_AN
7300: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
7310: 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e   ptrChngFunction
7320: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
7330: 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63 6f 75  /* Functions cou
7340: 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f 75 6e  nter1() and coun
7350: 74 65 72 32 28 29 20 68 61 76 65 20 74 68 65 20  ter2() have the 
7360: 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  same implementat
7370: 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a 2a 20  ion - they.  ** 
7380: 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e 20 61  both return an a
7390: 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67 65 72  scending integer
73a0: 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 2e   with each call.
73b0: 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31 28 29    But counter1()
73c0: 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a 2a 20   is marked.  ** 
73d0: 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  as non-determini
73e0: 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74 65 72  stic and counter
73f0: 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20 61 73  2() is marked as
7400: 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a   deterministic..
7410: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
7420: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7430: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7440: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7450: 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d 31 2c   "counter1", -1,
7460: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
7470: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
7480: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
7490: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
74a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
74b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
74c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
74d0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
74e0: 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51 4c 49  nter2", -1, SQLI
74f0: 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
7500: 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20  ETERMINISTIC,.  
7510: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
7520: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
7530: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
7540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7550: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
7560: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
7570: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
7580: 36 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61  6() API here. Ma
7590: 69 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75  inly for fun, bu
75a0: 74 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63  t also .  ** bec
75b0: 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74  ause it is not t
75c0: 65 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65  ested anywhere e
75d0: 6c 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  lse. */.  if( rc
75e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
75f0: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
7600: 55 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74  Utf16;.    sqlit
7610: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
7620: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
7630: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7640: 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  x);.    pVal = s
7650: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
7660: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
7670: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
7680: 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65   -1, "x_sqlite_e
7690: 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  xec", SQLITE_UTF
76a0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
76b0: 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
76c0: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
76d0: 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
76e0: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
76f0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7700: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
7710: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7740: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
7750: 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20  (db, zUtf16, .  
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
7770: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64   SQLITE_UTF16, d
7780: 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  b, sqlite3ExecFu
7790: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  nc, 0, 0);.    }
77a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
77b0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
77c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
77d0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
77e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
77f0: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
7800: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
7810: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
7820: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
7830: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
7840: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
7850: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
7860: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7870: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
7880: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
7890: 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67  he x_count() agg
78a0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
78b0: 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29  .**.** x_count()
78c0: 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62   counts the numb
78d0: 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61  er of non-null a
78e0: 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74  rguments.  But t
78f0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65  here are.** some
7900: 20 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74   twists for test
7910: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
7920: 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d  .** If the argum
7930: 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29  ent to x_count()
7940: 20 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54   is 40 then a UT
7950: 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70  F-8 error is rep
7960: 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  orted.** on the 
7970: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20  step function.  
7980: 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69  If x_count(41) i
7990: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55  s seen, then a U
79a0: 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69  TF-16 error.** i
79b0: 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68  s reported on th
79c0: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
79d0: 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63    If the total c
79e0: 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e  ount is 42, then
79f0: 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f  .** a UTF-8 erro
7a00: 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e  r is reported on
7a10: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75   the finalize fu
7a20: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
7a30: 65 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e  ef struct t1Coun
7a40: 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b  tCtx t1CountCtx;
7a50: 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43  .struct t1CountC
7a60: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b  tx {.  int n;.};
7a70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43  .static void t1C
7a80: 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69  ountStep(.  sqli
7a90: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7aa0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7ab0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31  e **argv.){.  t1
7ad0: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
7ae0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
7af0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
7b00: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
7b10: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
7b20: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
7b30: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
7b40: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20  type(argv[0]) ) 
7b50: 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  && p ){.    p->n
7b60: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  ++;.  }.  if( ar
7b70: 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  gc>0 ){.    int 
7b80: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
7b90: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
7ba0: 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b      if( v==40 ){
7bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7bc0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7bd0: 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34  ext, "value of 4
7be0: 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f  0 handed to x_co
7bf0: 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64  unt", -1);.#ifnd
7c00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7c10: 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69  TF16.    }else i
7c20: 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20  f( v==41 ){.    
7c30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74    const char zUt
7c40: 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20  f16ErrMsg[] = { 
7c50: 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32  0, 0x61, 0, 0x62
7c60: 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c  , 0, 0x63, 0, 0,
7c70: 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0};.      sqlit
7c80: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31  e3_result_error1
7c90: 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66  6(context, &zUtf
7ca0: 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54  16ErrMsg[1-SQLIT
7cb0: 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31  E_BIGENDIAN], -1
7cc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
7cd0: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
7ce0: 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61  void t1CountFina
7cf0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
7d00: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
7d10: 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b    t1CountCtx *p;
7d20: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
7d30: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7d40: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7d50: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
7d60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d  {.    if( p->n==
7d70: 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  42 ){.      sqli
7d80: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d90: 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75  (context, "x_cou
7da0: 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22  nt totals to 42"
7db0: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , -1);.    }else
7dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7dd0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
7de0: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
7df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
7e00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7e10: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73  MIT_DEPRECATED.s
7e20: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7e30: 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  yCountStep(.  sq
7e40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7e50: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7e60: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7e70: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7e80: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73  /* no-op */.}..s
7e90: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7ea0: 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73  yCountFinalize(s
7eb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7ec0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69  context){.  sqli
7ed0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
7ee0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
7ef0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
7f00: 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e  context));.}.#en
7f10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
7f20: 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  :  sqlite3_creat
7f30: 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a  e_aggregate DB.*
7f40: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
7f50: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7f60: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
7f70: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
7f80: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
7f90: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
7fa0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22   named "x_count"
7fb0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
7fc0: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
7fd0: 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  o the built-in c
7fe0: 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c  ount() function,
7ff0: 20 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63   with a few spec
8000: 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f  ial quirks.** fo
8010: 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71  r testing the sq
8020: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8030: 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a  or() APIs..**.**
8040: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f   The original mo
8050: 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  tivation for thi
8060: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f  s routine was to
8070: 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c   be able to call
8080: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
8090: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
80a0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
80b0: 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72  a query is in pr
80c0: 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a  ogress in order.
80d0: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53  ** to test the S
80e0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74  QLITE_MISUSE det
80f0: 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53  ection logic.  S
8100: 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a  ee misuse.test..
8110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8120: 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74  ne was later ext
8130: 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68  ended to test th
8140: 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33  e use of sqlite3
8150: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a  _result_error().
8160: 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67  ** within aggreg
8170: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
8180: 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69  *.** Later: It i
8190: 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e  s now also exten
81a0: 64 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20  ded to register 
81b0: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
81c0: 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63  nction.** "legac
81d0: 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20  y_count()" with 
81e0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74  the supplied dat
81f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68  abase handle. Th
8200: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
8210: 20 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63   test the deprec
8220: 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67  ated sqlite3_agg
8230: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41  regate_count() A
8240: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  PI..*/.static in
8250: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  t test_create_ag
8260: 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20  gregate(.  void 
8270: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
8280: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8290: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
82a0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
82b0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
82c0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
82d0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
82e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
82f0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8300: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
8310: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
8320: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
8330: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
8340: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
8350: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
8360: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8370: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
8380: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
8390: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
83a0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
83b0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
83c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83d0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
83e0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
83f0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
8400: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8410: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
8420: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8430: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30  db, "x_count", 0
8440: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8450: 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75  , 0,.      t1Cou
8460: 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69  ntStep,t1CountFi
8470: 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  nalize);.  if( r
8480: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8490: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
84a0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
84b0: 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20  (db, "x_count", 
84c0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
84d0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31  0, 0,.        t1
84e0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
84f0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a  tFinalize);.  }.
8500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8510: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
8520: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8530: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
8540: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8550: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61  nction(db, "lega
8560: 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51  cy_count", 0, SQ
8570: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a  LITE_ANY, 0, 0,.
8580: 20 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f          legacyCo
8590: 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43  untStep, legacyC
85a0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20  ountFinalize.   
85b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
85c0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
85d0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
85e0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
85f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
8600: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
8610: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
8620: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
8630: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8640: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
8650: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
8660: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
8670: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
8680: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
8690: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
86a0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
86b0: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
86c0: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
86d0: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
86e0: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
86f0: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
8700: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
8710: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
8720: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
8730: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
8740: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
8750: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
8760: 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28  int test_printf(
8770: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8780: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8790: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
87a0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
87b0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
87c0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
87d0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
87e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
87f0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8800: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
8820: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8830: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ent */.){.  if( 
8840: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
8850: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8860: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8870: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8880: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8890: 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
88a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
88b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
88c0: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
88d0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75  argv[1]);.  retu
88e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
88f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8900: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8910: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
8920: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8930: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
8940: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
8950: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
8960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8970: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8980: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
8990: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
89a0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
89b0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
89c0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
89d0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
89e0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
89f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8a00: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8a10: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8a20: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8a30: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8a40: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
8a50: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
8a60: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8a70: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
8a80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8a90: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8aa0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8ab0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
8ac0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
8ad0: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8af0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
8b00: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
8b10: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
8b20: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
8b30: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
8b40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8b50: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8b60: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8b70: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8b80: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8b90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8ba0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8bb0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8bc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8bd0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8be0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8bf0: 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  t64 FORMAT INTEG
8c00: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
8c10: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
8c20: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
8c30: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
8c40: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
8c50: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
8c60: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20  mprintf_int64(. 
8c70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8c80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8c90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8ca0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8cb0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8cc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8cd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8ce0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8cf0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8d00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8d20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
8d30: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
8d40: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
8d50: 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  a[3];.  char *z;
8d60: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
8d70: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8d80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8d90: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8da0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8db0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
8dc0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
8dd0: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
8de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8df0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
8e00: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
8e10: 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ( sqlite3Atoi64(
8e20: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
8e30: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
8e40: 30 28 61 72 67 76 5b 69 5d 29 2c 20 53 51 4c 49  0(argv[i]), SQLI
8e50: 54 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20  TE_UTF8) ){.    
8e60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8e70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75  lt(interp, "argu
8e80: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61  ment is not a va
8e90: 6c 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67  lid 64-bit integ
8ea0: 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  er", 0);.      r
8eb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d  .    }.  }.  z =
8ed0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8ee0: 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20  (argv[1], a[0], 
8ef0: 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54  a[1], a[2]);.  T
8f00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8f10: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
8f20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
8f30: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
8f40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
8f50: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
8f60: 6e 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20  ntf_long FORMAT 
8f70: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
8f80: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61  INTEGER.**.** Ca
8f90: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
8fa0: 74 68 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67  three long integ
8fb0: 65 72 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20  er arguments.   
8fc0: 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 74 68  This might be th
8fd0: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 73 71 6c  e.** same as sql
8fe0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8ff0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69   or sqlite3_mpri
9000: 6e 74 66 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e  ntf_int64, depen
9010: 64 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66  ding on.** platf
9020: 6f 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  orm..*/.static i
9030: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
9040: 74 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64 20  tf_long(.  void 
9050: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9060: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9070: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9080: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9090: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
90a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
90b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
90c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
90d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
90e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
90f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
9100: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9110: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f 6e  {.  int i;.  lon
9120: 67 20 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69 6e  g int a[3];.  in
9130: 74 20 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a  t b[3];.  char *
9140: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
9150: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9160: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9170: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9180: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
9190: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
91a0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
91b0: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
91c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
91d0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
91e0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
91f0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9200: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9210: 26 62 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &b[i-2]) ) retur
9220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9230: 20 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67 20   a[i-2] = (long 
9240: 69 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20 20  int)b[i-2];.    
9250: 61 5b 69 2d 32 5d 20 26 3d 20 28 28 28 75 36 34  a[i-2] &= (((u64
9260: 29 31 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e 74  )1)<<(sizeof(int
9270: 29 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20 7a  )*8))-1;.  }.  z
9280: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9290: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
92a0: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
92b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
92c0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
92d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
92e0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
92f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9300: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
9310: 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54  rintf_str FORMAT
9320: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9330: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61   STRING.**.** Ca
9340: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9350: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
9360: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74  ments and one st
9370: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  ring argument.*/
9380: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9390: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28  te3_mprintf_str(
93a0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
93b0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
93c0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
93d0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
93e0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
93f0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9400: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9410: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9420: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
9430: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
9440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
9450: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
9460: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
9470: 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20  a[3], i;.  char 
9480: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34  *z;.  if( argc<4
9490: 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20   || argc>5 ){.  
94a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
94b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
94c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
94d0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
94e0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
94f0: 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e  T INT INT ?STRIN
9500: 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  G?\"", 0);.    r
9510: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9520: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
9530: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
9540: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9550: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9560: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
9570: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9580: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
9590: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
95a0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
95b0: 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55  4 ? argv[4] : NU
95c0: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
95d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
95e0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
95f0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9600: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9610: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9620: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
9630: 20 49 4e 54 45 47 45 52 20 46 4f 52 4d 41 54 20   INTEGER FORMAT 
9640: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
9650: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c  STRING.**.** Cal
9660: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
9670: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
9680: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72  ents and one str
9690: 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ing argument.*/.
96a0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
96b0: 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 28  e3_snprintf_str(
96c0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
96d0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
96e0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
96f0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9700: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9710: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9720: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9730: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9740: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
9750: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
9760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
9770: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
9780: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
9790: 61 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e  a[3], i;.  int n
97a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
97b0: 66 28 20 61 72 67 63 3c 35 20 7c 7c 20 61 72 67  f( argc<5 || arg
97c0: 63 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>6 ){.    Tcl_A
97d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
97e0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
97f0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9800: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9810: 20 20 22 20 49 4e 54 20 46 4f 52 4d 41 54 20 49    " INT FORMAT I
9820: 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c  NT INT ?STRING?\
9830: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
9840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9850: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
9860: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
9870: 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e  1], &n) ) return
9880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
9890: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c  ( n<0 ){.    Tcl
98a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
98b0: 74 65 72 70 2c 20 22 4e 20 6d 75 73 74 20 62 65  terp, "N must be
98c0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20   non-negative", 
98d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
98e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
98f0: 66 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b  for(i=3; i<5; i+
9900: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
9910: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9920: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29  rgv[i], &a[i-3])
9930: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9940: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9950: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
9960: 2b 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  +1 );.  sqlite3_
9970: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61  snprintf(n, z, a
9980: 72 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[2], a[0], a[
9990: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
99a0: 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[5] : NULL);.  
99b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
99c0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
99d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
99e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
99f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9a00: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
9a10: 69 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d  intf_double FORM
9a20: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
9a30: 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20  ER DOUBLE.**.** 
9a40: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9a50: 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72  h two integer ar
9a60: 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20  guments and one 
9a70: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a  double argument.
9a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9a90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
9aa0: 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  uble(.  void *No
9ab0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
9ac0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
9ad0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
9ae0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
9af0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9b00: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b20: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9b30: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
9b40: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
9b50: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9b60: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9b70: 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20   int a[3], i;.  
9b80: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72  double r;.  char
9b90: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
9ba0: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
9bb0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9bc0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9bd0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9be0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9bf0: 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e   " FORMAT INT IN
9c00: 54 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b  T DOUBLE\"", 0);
9c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9c20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
9c30: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
9c40: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
9c50: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
9c60: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
9c70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9c80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
9c90: 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70  GetDouble(interp
9ca0: 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 29 20 29  , argv[4], &r) )
9cb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9cc0: 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  R;.  z = sqlite3
9cd0: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
9ce0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29  , a[0], a[1], r)
9cf0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
9d00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
9d10: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
9d20: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
9d30: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
9d40: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
9d50: 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
9d60: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
9d70: 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  UBLE.**.** Call 
9d80: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73  mprintf with a s
9d90: 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67  ingle double arg
9da0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74  ument which is t
9db0: 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68  he product of th
9dc0: 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e  e.** two argumen
9dd0: 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20  ts given above. 
9de0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
9df0: 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c   generate overfl
9e00: 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77  ow and underflow
9e10: 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74  .** doubles to t
9e20: 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72  est that they ar
9e30: 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70  e converted prop
9e40: 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erly..*/.static 
9e50: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
9e60: 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f  ntf_scaled(.  vo
9e70: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9e80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9e90: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9ea0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9eb0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9ec0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9ed0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
9ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9ef0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
9f00: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
9f10: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
9f20: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
9f30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
9f40: 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63  double r[2];.  c
9f50: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
9f60: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
9f70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9f80: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
9f90: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
9fa0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
9fb0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55      " FORMAT DOU
9fc0: 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30  BLE DOUBLE\"", 0
9fd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9fe0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
9ff0: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
a000: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a010: 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  etDouble(interp,
a020: 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32   argv[i], &r[i-2
a030: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
a040: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d  ERROR;.  }.  z =
a050: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a060: 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72  (argv[1], r[0]*r
a070: 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [1]);.  Tcl_Appe
a080: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a090: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
a0a0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
a0b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a0c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
a0d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
a0e0: 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52 49  only FORMAT STRI
a0f0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
a100: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a110: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a120: 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65  ent which is the
a130: 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a   product of the.
a140: 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  ** two arguments
a150: 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54   given above.  T
a160: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  his is used to g
a170: 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77  enerate overflow
a180: 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a   and underflow.*
a190: 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73  * doubles to tes
a1a0: 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  t that they are 
a1b0: 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72  converted proper
a1c0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
a1d0: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
a1e0: 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69  f_stronly(.  voi
a1f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
a200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a210: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a220: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a230: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
a250: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
a260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a270: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
a280: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
a290: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
a2a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
a2b0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
a2c0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
a2d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a2e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
a2f0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
a300: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
a310: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
a320: 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30  MAT STRING\"", 0
a330: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a340: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
a350: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
a360: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67 76  tf(argv[1], argv
a370: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
a380: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a390: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
a3a0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
a3b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a3c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
a3d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
a3e0: 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48 45  double FORMAT HE
a3f0: 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  X.**.** Call mpr
a400: 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67  intf with a sing
a410: 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  le double argume
a420: 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72 69  nt which is deri
a430: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
a440: 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f  hexadecimal enco
a450: 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45 20  ding of an IEEE 
a460: 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  double..*/.stati
a470: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
a480: 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28  rintf_hexdouble(
a490: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
a4a0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
a4b0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
a4c0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
a4d0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
a4e0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
a4f0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
a500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a510: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a520: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
a530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
a540: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
a550: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
a560: 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b   *z;.  double r;
a570: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
a580: 78 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65  x1, x2;.  sqlite
a590: 5f 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28  _uint64 d;.  if(
a5a0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
a5b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a5c0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a5d0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a5e0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a5f0: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a600: 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20  STRING\"", 0);. 
a610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a620: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ROR;.  }.  if( s
a630: 73 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22  scanf(argv[2], "
a640: 25 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20  %08x%08x", &x2, 
a650: 26 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54  &x1)!=2 ){.    T
a660: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a670: 69 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67  interp, "2nd arg
a680: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
a690: 31 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66  16-characters of
a6a0: 20 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72   hex", 0);.    r
a6b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a6c0: 0a 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20  .  }.  d = x2;. 
a6d0: 20 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78   d = (d<<32) + x
a6e0: 31 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20  1;.  memcpy(&r, 
a6f0: 26 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a  &d, sizeof(r));.
a700: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
a710: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72  rintf(argv[1], r
a720: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
a730: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
a740: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
a750: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
a760: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
a770: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
a780: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
a790: 61 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a  ache ?BOOLEAN?.*
a7a0: 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  *.*/.#if !define
a7b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a7c0: 41 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74  ARED_CACHE).stat
a7d0: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62  ic int test_enab
a7e0: 6c 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69  le_shared(.  Cli
a7f0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
a800: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
a810: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
a820: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
a830: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a840: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a850: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a860: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a870: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a880: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
a890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a8a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a8b0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
a8c0: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
a8d0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
a8e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a8f0: 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69   int enable;.  i
a900: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69  nt ret = 0;..  i
a910: 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
a920: 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
a930: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
a940: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
a950: 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20  ?BOOLEAN?");.   
a960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a970: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20 73  R;.  }.  ret = s
a980: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
a990: 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
a9a0: 61 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62  abled;..  if( ob
a9b0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
a9c0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
a9d0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a9e0: 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29  bjv[1], &enable)
a9f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
aa00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
aa10: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
aa20: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
aa30: 5f 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a  _cache(enable);.
aa40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
aa50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
aa60: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
aa70: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
aa80: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
aa90: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
aaa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
aab0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
aac0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
aad0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
aae0: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29  wBooleanObj(ret)
aaf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
ab00: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a  OK;.}.#endif....
ab10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
ab20: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
ab30: 73 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20  sult_codes   DB 
ab40: 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f     BOOLEAN.**.*/
ab50: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
ab60: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
ab70: 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74  _codes(.  Client
ab80: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
ab90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
aba0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
abb0: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
abc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
abd0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
abe0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
abf0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
ac00: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
ac10: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
ac20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ac30: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
ac40: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
ac50: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
ac60: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
ac70: 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a  {.  int enable;.
ac80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
ac90: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
aca0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
acb0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
acc0: 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45   objv, "DB BOOLE
acd0: 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  AN");.    return
ace0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
acf0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
ad00: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ad10: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
ad20: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
ad30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
ad40: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
ad50: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ad60: 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65  objv[2], &enable
ad70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ad80: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
ad90: 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
ada0: 63 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65  codes(db, enable
adb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
adc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
add0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  ge: sqlite3_libv
ade0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a  ersion_number.**
adf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
ae00: 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  est_libversion_n
ae10: 75 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44  umber(.  ClientD
ae20: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
ae30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
ae40: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
ae50: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
ae60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ae70: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ae80: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ae90: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
aea0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
aeb0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
aec0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
aed0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
aee0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
aef0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
af00: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
af10: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
af20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
af30: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
af40: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
af50: 62 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72  ber()));.  retur
af60: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
af70: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
af80: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
af90: 65 74 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d  etadata DB dbnam
afa0: 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d  e tblname colnam
afb0: 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.**.*/.static i
afc0: 6e 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f  nt test_table_co
afd0: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
afe0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
aff0: 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
b000: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
b010: 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
b020: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
b030: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
b040: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
b050: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
b060: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
b070: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
b080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b090: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
b0a0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
b0b0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
b0c0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
b0d0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
b0e0: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
b0f0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e  char *zDb;.  con
b100: 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20  st char *zTbl;. 
b110: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
b120: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  l;.  int rc;.  T
b130: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
b140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
b150: 74 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20  tatype;.  const 
b160: 63 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a  char *zCollseq;.
b170: 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20    int notnull;. 
b180: 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b   int primarykey;
b190: 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65  .  int autoincre
b1a0: 6d 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  ment;..  if( obj
b1b0: 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
b1c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
b1d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
b1e0: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e  1, objv, "DB dbn
b1f0: 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e  ame tblname coln
b200: 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ame");.    retur
b210: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
b220: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
b230: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
b240: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
b250: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
b260: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
b270: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
b280: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
b290: 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Tbl = Tcl_GetStr
b2a0: 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
b2b0: 7a 43 6f 6c 20 3d 20 6f 62 6a 63 3d 3d 35 20 3f  zCol = objc==5 ?
b2c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b2d0: 62 6a 76 5b 34 5d 29 20 3a 20 30 3b 0a 0a 20 20  bjv[4]) : 0;..  
b2e0: 69 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29 3d  if( strlen(zDb)=
b2f0: 3d 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a 20  =0 ) zDb = 0;.. 
b300: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
b310: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
b320: 61 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54 62  ata(db, zDb, zTb
b330: 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20 20  l, zCol, .      
b340: 26 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43 6f  &zDatatype, &zCo
b350: 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c  llseq, &notnull,
b360: 20 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26 61   &primarykey, &a
b370: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a  utoincrement);..
b380: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b390: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
b3a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b3b0: 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
b3c0: 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
b3d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b3e0: 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  ;.  }..  pRet = 
b3f0: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
b400: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b410: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
b420: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b430: 62 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d 31  bj(zDatatype, -1
b440: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
b450: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b460: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
b470: 74 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65  tringObj(zCollse
b480: 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  q, -1));.  Tcl_L
b490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b4a0: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
b4b0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75  _NewIntObj(notnu
b4c0: 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ll));.  Tcl_List
b4d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
b4e0: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
b4f0: 77 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79 6b  wIntObj(primaryk
b500: 65 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ey));.  Tcl_List
b510: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
b520: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
b530: 77 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63 72  wIntObj(autoincr
b540: 65 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 53  ement));.  Tcl_S
b550: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b560: 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65  rp, pRet);..  re
b570: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
b580: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b590: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73 74  MIT_INCRBLOB..st
b5a0: 61 74 69 63 20 69 6e 74 20 62 6c 6f 62 48 61 6e  atic int blobHan
b5b0: 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20 54 63  dleFromObj(.  Tc
b5c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b5d0: 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  , .  Tcl_Obj *pO
b5e0: 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  bj,.  sqlite3_bl
b5f0: 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a 20  ob **ppBlob.){. 
b600: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
b610: 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65  n;..  z = Tcl_Ge
b620: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
b630: 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20  Obj, &n);.  if( 
b640: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 42  n==0 ){.    *ppB
b650: 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  lob = 0;.  }else
b660: 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  {.    int notUse
b670: 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  d;.    Tcl_Chann
b680: 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20  el channel;.    
b690: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
b6a0: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a 20 20  nceData;.    .  
b6b0: 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f    channel = Tcl_
b6c0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
b6d0: 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p, z, &notUsed);
b6e0: 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e 6e 65  .    if( !channe
b6f0: 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  l ) return TCL_E
b700: 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c 5f 46  RROR;..    Tcl_F
b710: 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b 0a 20  lush(channel);. 
b720: 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68 61 6e     Tcl_Seek(chan
b730: 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  nel, 0, SEEK_SET
b740: 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e 63 65  );..    instance
b750: 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43 68  Data = Tcl_GetCh
b760: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
b770: 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20  a(channel);.    
b780: 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c  *ppBlob = *((sql
b790: 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73  ite3_blob **)ins
b7a0: 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20 7d 0a  tanceData);.  }.
b7b0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b7c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
b7d0: 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  test_blob_reopen
b7e0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
b7f0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
b800: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
b810: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
b820: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
b830: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
b840: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
b850: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
b860: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
b870: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
b880: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
b890: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b8a0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
b8b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
b8c0: 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77  Tcl_WideInt iRow
b8d0: 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  id;.  sqlite3_bl
b8e0: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
b8f0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
b900: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
b910: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b920: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
b930: 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29 3b 0a 20  ANNEL ROWID");. 
b940: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b950: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
b960: 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62  blobHandleFromOb
b970: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
b980: 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74  ], &pBlob) ) ret
b990: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b9a0: 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65   if( Tcl_GetWide
b9b0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
b9c0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 52 6f  p, objv[2], &iRo
b9d0: 77 69 64 29 20 29 20 72 65 74 75 72 6e 20 54 43  wid) ) return TC
b9e0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
b9f0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
ba00: 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77  open(pBlob, iRow
ba10: 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  id);.  if( rc!=S
ba20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ba30: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
ba40: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
ba50: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
ba60: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
ba70: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
ba80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
ba90: 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52  TCL_OK : TCL_ERR
baa0: 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a  OR);.}..#endif..
bab0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
bac0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bad0: 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44  ation_v2 DB-HAND
bae0: 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43  LE NAME CMP-PROC
baf0: 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20   DEL-PROC.**.** 
bb00: 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f 63 20    This Tcl proc 
bb10: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
bb20: 69 6e 67 20 74 68 65 20 65 78 70 65 72 69 6d 65  ing the experime
bb30: 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ntal.**   sqlite
bb40: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
bb50: 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66 61 63  on_v2() interfac
bb60: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65 73  e..*/.struct Tes
bb70: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20  tCollationX {.  
bb80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
bb90: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
bba0: 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Cmp;.  Tcl_Obj *
bbb0: 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  pDel;.};.typedef
bbc0: 20 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c   struct TestColl
bbd0: 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61  ationX TestColla
bbe0: 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f  tionX;.static vo
bbf0: 69 64 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  id testCreateCol
bc00: 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a  lationDel(void *
bc10: 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c  pCtx){.  TestCol
bc20: 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65  lationX *p = (Te
bc30: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70  stCollationX *)p
bc40: 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d  Ctx;..  int rc =
bc50: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
bc60: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65  ->interp, p->pDe
bc70: 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  l, TCL_EVAL_DIRE
bc80: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
bc90: 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  AL);.  if( rc!=T
bca0: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  CL_OK ){.    Tcl
bcb0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
bcc0: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
bcd0: 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ..  Tcl_DecrRefC
bce0: 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20  ount(p->pCmp);. 
bcf0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bd00: 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71  t(p->pDel);.  sq
bd10: 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64  lite3_free((void
bd20: 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20   *)p);.}.static 
bd30: 69 6e 74 20 74 65 73 74 43 72 65 61 74 65 43 6f  int testCreateCo
bd40: 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f  llationCmp(.  vo
bd50: 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  id *pCtx,.  int 
bd60: 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76  nLeft,.  const v
bd70: 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e  oid *zLeft,.  in
bd80: 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73  t nRight,.  cons
bd90: 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29  t void *zRight.)
bda0: 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  {.  TestCollatio
bdb0: 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c  nX *p = (TestCol
bdc0: 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a  lationX *)pCtx;.
bdd0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
bde0: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
bdf0: 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a  teObj(p->pCmp);.
be00: 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a    int iRes = 0;.
be10: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
be20: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
be30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
be40: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
be50: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
be60: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c  ngObj((char *)zL
be70: 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20  eft, nLeft));.  
be80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
be90: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
bea0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
beb0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 52  ngObj((char *)zR
bec0: 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a  ight,nRight));..
bed0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
bee0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
bef0: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
bf00: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
bf10: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
bf20: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
bf30: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
bf40: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  (p->interp, Tcl_
bf50: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
bf60: 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73 29 0a  interp), &iRes).
bf70: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
bf80: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
bf90: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54  interp);.  }.  T
bfa0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
bfb0: 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72 65 74  pScript);..  ret
bfc0: 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74  urn iRes;.}.stat
bfd0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
bfe0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
bff0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
c000: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74  ientData, /* Not
c010: 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49   used */.  Tcl_I
c020: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
c030: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
c040: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
c050: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
c060: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
c070: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
c080: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
c090: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
c0a0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
c0b0: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
c0c0: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
c0d0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70  estCollationX *p
c0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
c0f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
c100: 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
c110: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c120: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
c130: 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41  v, "DB-HANDLE NA
c140: 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d  ME CMP-PROC DEL-
c150: 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75  PROC");.    retu
c160: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c170: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
c180: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
c190: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c1a0: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
c1b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
c1c0: 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74   p = (TestCollat
c1d0: 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d  ionX *)sqlite3_m
c1e0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73  alloc(sizeof(Tes
c1f0: 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20  tCollationX));. 
c200: 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b   p->pCmp = objv[
c210: 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20  3];.  p->pDel = 
c220: 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e  objv[4];.  p->in
c230: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
c240: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
c250: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
c260: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c270: 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pDel);..  rc =
c280: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c290: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
c2a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c2b0: 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20  bjv[2]), 16, .  
c2c0: 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74      (void *)p, t
c2d0: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
c2e0: 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74  onCmp, testCreat
c2f0: 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20  eCollationDel.  
c300: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c310: 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20  ITE_MISUSE ){.  
c320: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c330: 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  lt(interp, "sqli
c340: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
c350: 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20 74  te_v2() failed t
c360: 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20 20  o detect ".     
c370: 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63   "an invalid enc
c380: 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30  oding", (char*)0
c390: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c3a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
c3b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
c3c0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
c3d0: 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  db, Tcl_GetStrin
c3e0: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49  g(objv[2]), SQLI
c3f0: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
c400: 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43  (void *)p, testC
c410: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
c420: 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  p, testCreateCol
c430: 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20  lationDel.  );. 
c440: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
c450: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20  }../*.** USAGE: 
c460: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c470: 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41  unction_v2 DB NA
c480: 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57 49  ME NARG ENC ?SWI
c490: 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61  TCHES?.**.** Ava
c4a0: 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73 20  ilable switches 
c4b0: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75  are:.**.**   -fu
c4c0: 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a 20  nc    SCRIPT.** 
c4d0: 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49 50    -step    SCRIP
c4e0: 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20  T.**   -final   
c4f0: 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73  SCRIPT.**   -des
c500: 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74  troy SCRIPT.*/.t
c510: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 72  ypedef struct Cr
c520: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 43  eateFunctionV2 C
c530: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b  reateFunctionV2;
c540: 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46 75  .struct CreateFu
c550: 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c  nctionV2 {.  Tcl
c560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
c570: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e  .  Tcl_Obj *pFun
c580: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c590: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c5a0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61   function invoca
c5b0: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  tion */.  Tcl_Ob
c5c0: 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20 20  j *pStep;       
c5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72            /* Scr
c5e0: 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74 65  ipt for agg. ste
c5f0: 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a  p invocation */.
c600: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61    Tcl_Obj *pFina
c610: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c620: 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20    /* Script for 
c630: 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f  agg. finalizatio
c640: 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a  n invocation */.
c650: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74    Tcl_Obj *pDest
c660: 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  roy;            
c670: 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20    /* Destructor 
c680: 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61  script */.};.sta
c690: 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e 63  tic void cf2Func
c6a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c6b0: 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c   *ctx, int nArg,
c6c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c6d0: 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63  *aArg){.}.static
c6e0: 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73 71   void cf2Step(sq
c6f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
c700: 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
c710: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41  lite3_value **aA
c720: 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  rg){.}.static vo
c730: 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c 69  id cf2Final(sqli
c740: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
c750: 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  ){.}.static void
c760: 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69 64   cf2Destroy(void
c770: 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65 61   *pUser){.  Crea
c780: 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20  teFunctionV2 *p 
c790: 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f  = (CreateFunctio
c7a0: 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20  nV2 *)pUser;..  
c7b0: 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26 26  if( p->interp &&
c7c0: 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a   p->pDestroy ){.
c7d0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c      int rc = Tcl
c7e0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
c7f0: 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f  terp, p->pDestro
c800: 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
c810: 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f  c!=TCL_OK ) Tcl_
c820: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c830: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c840: 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20  .  if( p->pFunc 
c850: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
c860: 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  nt(p->pFunc); . 
c870: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
c880: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c890: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
c8a0: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54  f( p->pFinal ) T
c8b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c8c0: 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69  p->pFinal); .  i
c8d0: 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  f( p->pDestroy )
c8e0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c8f0: 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20  t(p->pDestroy); 
c900: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c910: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
c920: 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e   test_create_fun
c930: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65  ction_v2(.  Clie
c940: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c950: 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  a,          /* N
c960: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
c970: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c990: 54 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c  The invoking TCL
c9a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
c9b0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c9e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
c9f0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
ca00: 76 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v[]           /*
ca10: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
ca20: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
ca30: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
ca40: 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69  char *zFunc;.  i
ca50: 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65  nt nArg;.  int e
ca60: 6e 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63  nc;.  CreateFunc
ca70: 74 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74  tionV2 *p;.  int
ca80: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
ca90: 20 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65   struct EncTable
caa0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
cab0: 72 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74  r *zEnc;.    int
cac0: 20 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d   enc;.  } aEnc[]
cad0: 20 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22   = {.    {"utf8"
cae0: 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38  ,    SQLITE_UTF8
caf0: 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22   },.    {"utf16"
cb00: 2c 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ,   SQLITE_UTF16
cb10: 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c   },.    {"utf16l
cb20: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
cb30: 4c 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31  LE },.    {"utf1
cb40: 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6be", SQLITE_UTF
cb50: 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e  16BE },.    {"an
cb60: 79 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41  y",     SQLITE_A
cb70: 4e 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20  NY },.    {"0", 
cb80: 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20  0 }.  };..  if( 
cb90: 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25  objc<5 || (objc%
cba0: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  2)==0 ){.    Tcl
cbb0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
cbc0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
cbd0: 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43  DB NAME NARG ENC
cbe0: 20 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a   SWITCHES...");.
cbf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cc00: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
cc10: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
cc20: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
cc30: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
cc40: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
cc50: 45 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d  ERROR;.  zFunc =
cc60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
cc70: 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
cc80: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
cc90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
cca0: 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72  , &nArg) ) retur
ccb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ccc0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
ccd0: 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74  romObjStruct(int
cce0: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45  erp, objv[4], aE
ccf0: 6e 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b  nc, sizeof(aEnc[
cd00: 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  0]), .          
cd10: 22 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26  "encoding", 0, &
cd20: 65 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  enc).  ){.    re
cd30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cd40: 20 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63    }.  enc = aEnc
cd50: 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20  [enc].enc;..  p 
cd60: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
cd70: 28 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75  (sizeof(CreateFu
cd80: 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73  nctionV2));.  as
cd90: 73 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d  sert( p );.  mem
cda0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
cdb0: 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56  (CreateFunctionV
cdc0: 32 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70  2));.  p->interp
cdd0: 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f   = interp;..  fo
cde0: 72 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69  r(i=5; i<objc; i
cdf0: 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  +=2){.    int iS
ce00: 77 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74  witch;.    const
ce10: 20 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b   char *azSwitch[
ce20: 5d 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d  ] = {"-func", "-
ce30: 73 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c  step", "-final",
ce40: 20 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b   "-destroy", 0};
ce50: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
ce60: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
ce70: 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a  erp, objv[i], az
ce80: 53 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22  Switch, "switch"
ce90: 2c 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29  , 0, &iSwitch) )
cea0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ceb0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72  free(p);.      r
cec0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ced0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
cee0: 63 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20  ch( iSwitch ){. 
cef0: 20 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e       case 0: p->
cf00: 70 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31  pFunc = objv[i+1
cf10: 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ];      break;. 
cf20: 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e       case 1: p->
cf30: 70 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31  pStep = objv[i+1
cf40: 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ];      break;. 
cf50: 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e       case 2: p->
cf60: 70 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b  pFinal = objv[i+
cf70: 31 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  1];     break;. 
cf80: 20 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e       case 3: p->
cf90: 70 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b  pDestroy = objv[
cfa0: 69 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20  i+1];   break;. 
cfb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
cfc0: 2d 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75  ->pFunc ) p->pFu
cfd0: 6e 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  nc = Tcl_Duplica
cfe0: 74 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b  teObj(p->pFunc);
cff0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70   .  if( p->pStep
d000: 20 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63   ) p->pStep = Tc
d010: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
d020: 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28  ->pStep); .  if(
d030: 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e   p->pFinal ) p->
d040: 70 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70  pFinal = Tcl_Dup
d050: 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69  licateObj(p->pFi
d060: 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  nal); .  if( p->
d070: 70 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44  pDestroy ) p->pD
d080: 65 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70  estroy = Tcl_Dup
d090: 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65  licateObj(p->pDe
d0a0: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20  stroy); ..  if( 
d0b0: 70 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49  p->pFunc ) Tcl_I
d0c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
d0d0: 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d  Func); .  if( p-
d0e0: 3e 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63  >pStep ) Tcl_Inc
d0f0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74  rRefCount(p->pSt
d100: 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  ep); .  if( p->p
d110: 46 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72  Final ) Tcl_Incr
d120: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e  RefCount(p->pFin
d130: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d140: 44 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e  Destroy ) Tcl_In
d150: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44  crRefCount(p->pD
d160: 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20  estroy); ..  rc 
d170: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
d180: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c  _function_v2(db,
d190: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
d1a0: 63 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20  c, (void *)p, . 
d1b0: 20 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f       (p->pFunc ?
d1c0: 20 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20   cf2Func : 0),. 
d1d0: 20 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f       (p->pStep ?
d1e0: 20 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20   cf2Step : 0),. 
d1f0: 20 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20       (p->pFinal 
d200: 3f 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c  ? cf2Final : 0),
d210: 0a 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f  .      cf2Destro
d220: 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  y.  );.  if( rc!
d230: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d240: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
d250: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
d260: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d270: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
d280: 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
d290: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d2a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
d2b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
d2c0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
d2d0: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
d2e0: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45  n DB-HANDLE FILE
d2f0: 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69   ?PROC?.*/.stati
d300: 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f  c int test_load_
d310: 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69  extension(.  Cli
d320: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
d330: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
d340: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
d350: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
d360: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
d370: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
d380: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
d390: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
d3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d3b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
d3c0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
d3d0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
d3e0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
d3f0: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64   */.){.  Tcl_Cmd
d400: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
d410: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
d420: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
d430: 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  Db;.  char *zFil
d440: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 63  e;.  char *zProc
d450: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
d460: 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  rr = 0;..  if( o
d470: 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d  bjc!=4 && objc!=
d480: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
d490: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d4a0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48  , 1, objv, "DB-H
d4b0: 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43  ANDLE FILE ?PROC
d4c0: 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
d4d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d4e0: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
d4f0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
d500: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
d510: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
d520: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  .  if( objc==4 )
d530: 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 54 63  {.    zProc = Tc
d540: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d550: 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  [3]);.  }..  /* 
d560: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
d570: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
d580: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
d590: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
d5a0: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
d5b0: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
d5c0: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
d5d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d5e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
d5f0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
d600: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
d610: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d620: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
d630: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
d640: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
d650: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
d660: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
d670: 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20  ..  /* Call the 
d680: 75 6e 64 65 72 6c 79 69 6e 67 20 43 20 66 75 6e  underlying C fun
d690: 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72  ction. If an err
d6a0: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72  or occurs, set r
d6b0: 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45  c to .  ** TCL_E
d6c0: 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e  RROR and load an
d6d0: 79 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20 69  y error string i
d6e0: 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65  nto the interpre
d6f0: 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a  ter. If no .  **
d700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
d710: 65 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e  et rc to TCL_OK.
d720: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
d730: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
d740: 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53  TENSION.  rc = S
d750: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a  QLITE_ERROR;.  z
d760: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
d770: 72 69 6e 74 66 28 22 74 68 69 73 20 62 75 69 6c  rintf("this buil
d780: 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f  d omits sqlite3_
d790: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
d7a0: 22 29 3b 0a 20 20 28 76 6f 69 64 29 7a 50 72 6f  ");.  (void)zPro
d7b0: 63 3b 0a 20 20 28 76 6f 69 64 29 7a 46 69 6c 65  c;.  (void)zFile
d7c0: 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73  ;.#else.  rc = s
d7d0: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
d7e0: 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c  nsion(db, zFile,
d7f0: 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a   zProc, &zErr);.
d800: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
d810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d820: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
d830: 69 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a  interp, zErr ? z
d840: 45 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f  Err : "", TCL_VO
d850: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20  LATILE);.    rc 
d860: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  = TCL_ERROR;.  }
d870: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54  else{.    rc = T
d880: 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  CL_OK;.  }.  sql
d890: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
d8a0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
d8b0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
d8c0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
d8d0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d  ad_extension DB-
d8e0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a  HANDLE ONOFF.*/.
d8f0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d900: 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43  enable_load(.  C
d910: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
d920: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
d930: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
d940: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
d950: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
d960: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
d970: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
d980: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d9a0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d9b0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
d9c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
d9d0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
d9e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
d9f0: 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
da00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
da10: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e   char *zDb;.  in
da20: 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20  t onoff;..  if( 
da30: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
da40: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
da50: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
da60: 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46   "DB-HANDLE ONOF
da70: 46 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  F");.    return 
da80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
da90: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
daa0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a  ring(objv[1]);..
dab0: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
dac0: 20 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   C database hand
dad0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20  le from the Tcl 
dae0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a  command name */.
daf0: 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
db00: 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
db10: 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29  , zDb, &cmdInfo)
db20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
db30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
db40: 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
db50: 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68  und: ", zDb, (ch
db60: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
db70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
db80: 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63  }.  db = ((struc
db90: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
dba0: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
dbb0: 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  a)->db;.  assert
dbc0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
dbd0: 74 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65  the onoff parame
dbe0: 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c  ter */.  if( Tcl
dbf0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
dc00: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
dc10: 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
dc20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
dc30: 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ROR;.  }..#ifdef
dc40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
dc50: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63  D_EXTENSION.  Tc
dc60: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
dc70: 6e 74 65 72 70 2c 20 22 74 68 69 73 20 62 75 69  nterp, "this bui
dc80: 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33  ld omits sqlite3
dc90: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
dca0: 29 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )");.  return TC
dcb0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
dcc0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
dcd0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
dce0: 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74  b, onoff);.  ret
dcf0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64  urn TCL_OK;.#end
dd00: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  if.}../*.** Usag
dd10: 65 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  e:  sqlite_abort
dd20: 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  .**.** Shutdown 
dd30: 74 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65  the process imme
dd40: 64 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69  diately.  This i
dd50: 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68  s not a clean sh
dd60: 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20  utdown..** This 
dd70: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
dd80: 74 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f  to test the reco
dd90: 76 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20  verability of a 
dda0: 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74  database in.** t
ddb0: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72  he event of a pr
ddc0: 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a  ogram crash..*/.
ddd0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
dde0: 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20  e_abort(.  void 
ddf0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
de00: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
de10: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
de20: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
de30: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
de40: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
de50: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
de60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
de70: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
de80: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
de90: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
dea0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
deb0: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d  {.#if defined(_M
dec0: 53 43 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20  SC_VER).  /* We 
ded0: 64 6f 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69  do this, otherwi
dee0: 73 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c  se the test will
def0: 20 68 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70   halt with a pop
df00: 75 70 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20  up message.   * 
df10: 74 68 61 74 20 77 65 20 68 61 76 65 20 74 6f 20  that we have to 
df20: 63 6c 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72  click away befor
df30: 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20  e the test will 
df40: 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a  continue..   */.
df50: 20 20 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68    _set_abort_beh
df60: 61 76 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f  avior( 0, _CALL_
df70: 52 45 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23  REPORTFAULT );.#
df80: 65 6e 64 69 66 0a 20 20 65 78 69 74 28 32 35 35  endif.  exit(255
df90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74  );.  assert( int
dfa0: 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54  erp==0 );   /* T
dfb0: 68 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  his will always 
dfc0: 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  fail */.  return
dfd0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
dfe0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
dff0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65  routine is a use
e000: 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75  r-defined SQL fu
e010: 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72  nction whose pur
e020: 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65  pose.** is to te
e030: 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  st the sqlite_se
e040: 74 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a  t_result() API..
e050: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
e060: 65 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  estFunc(sqlite3_
e070: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
e080: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
e090: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
e0a0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63  ){.  while( argc
e0b0: 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=2 ){.    const
e0c0: 20 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28   char *zArg0 = (
e0d0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
e0e0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
e0f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30  );.    if( zArg0
e100: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   ){.      if( 0=
e110: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
e120: 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b  zArg0, "int") ){
e130: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e140: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
e150: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
e160: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29  ue_int(argv[1]))
e170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e180: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e190: 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d  (zArg0,"int64")=
e1a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
e1b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
e1c0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  64(context, sqli
e1d0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
e1e0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e1f0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e200: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e210: 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a  "string")==0 ){.
e220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e230: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
e240: 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ext, (char*)sqli
e250: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
e260: 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20  rgv[1]), -1,.   
e270: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
e280: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
e290: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
e2a0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
e2b0: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
e2c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e2d0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
e2e0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
e2f0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
e300: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
e310: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
e320: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75  trICmp(zArg0,"nu
e330: 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
e340: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
e350: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
e360: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e370: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e380: 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d  zArg0,"value")==
e390: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
e3a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
e3b0: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
e3c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
e3d0: 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20  t(argv[1])]);.  
e3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e3f0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
e400: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
e410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f  else{.      goto
e420: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e430: 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b  }.    argc -= 2;
e440: 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a  .    argv += 2;.
e450: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65    }.  return;..e
e460: 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
e470: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
e480: 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20  (context,"first 
e490: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
e4a0: 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20  be one of: ".   
e4b0: 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74     "int int64 st
e4c0: 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c  ring double null
e4d0: 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a   value", -1);.}.
e4e0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
e4f0: 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f  sqlite_register_
e500: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44  test_function  D
e510: 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  B  NAME.**.** Re
e520: 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20  gister the test 
e530: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  SQL function on 
e540: 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20  the database DB 
e550: 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e  under the name N
e560: 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  AME..*/.static i
e570: 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72  nt test_register
e580: 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _func(.  void *N
e590: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
e5a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
e5b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
e5c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
e5d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
e5e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e600: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
e610: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
e620: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
e630: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
e640: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
e650: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
e660: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
e670: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
e680: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e690: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
e6a0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
e6b0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
e6c0: 20 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54        " DB FUNCT
e6d0: 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20  ION-NAME", 0);. 
e6e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e6f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
e700: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
e710: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
e720: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
e730: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
e740: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e750: 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
e760: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
e770: 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73  8, 0, .      tes
e780: 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  tFunc, 0, 0);.  
e790: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
e7a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e7b0: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
e7c0: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
e7d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e7e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
e7f0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
e800: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
e810: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
e820: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
e830: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
e840: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
e850: 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54  3_finalize  STMT
e860: 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65   .**.** Finalize
e870: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
e880: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
e890: 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65  nt test_finalize
e8a0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
e8b0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
e8c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
e8d0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
e8e0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
e8f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
e900: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
e910: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
e920: 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  db = 0;..  if( o
e930: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
e940: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e950: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
e960: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
e970: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
e980: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e990: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
e9a0: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
e9b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e9c0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
e9d0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
e9e0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
e9f0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
ea00: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
ea10: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
ea20: 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62   pStmt ){.    db
ea30: 20 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d   = StmtToDb(pStm
ea40: 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
ea50: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
ea60: 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
ea70: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
ea80: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
ea90: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
eaa0: 54 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26  TIC);.  if( db &
eab0: 26 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  & sqlite3TestErr
eac0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
ead0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
eae0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
eaf0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
eb00: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
eb10: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20  e3_stmt_status  
eb20: 53 54 4d 54 20 20 43 4f 44 45 20 20 52 45 53 45  STMT  CODE  RESE
eb30: 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20  TFLAG.**.** Get 
eb40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
eb50: 74 61 74 75 73 20 63 6f 75 6e 74 65 72 20 66 72  tatus counter fr
eb60: 6f 6d 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  om a statement..
eb70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
eb80: 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a  st_stmt_status(.
eb90: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
eba0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
ebb0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
ebc0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
ebd0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
ebe0: 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a  {.  int iValue;.
ebf0: 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d 20 30 2c    int i, op = 0,
ec00: 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63 6f   resetFlag;.  co
ec10: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
ec20: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  e;.  sqlite3_stm
ec30: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74 61  t *pStmt;..  sta
ec40: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
ec50: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
ec60: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
ec70: 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d 20  t op;.  } aOp[] 
ec80: 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
ec90: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
eca0: 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20 53  LSCAN_STEP",   S
ecb0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
ecc0: 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 20  _FULLSCAN_STEP  
ecd0: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
ece0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
ecf0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  T",            S
ed00: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
ed10: 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20 20  _SORT           
ed20: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
ed30: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
ed40: 4f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 53  OINDEX",       S
ed50: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
ed60: 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20 20  _AUTOINDEX      
ed70: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
ed80: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f  E_STMTSTATUS_VM_
ed90: 53 54 45 50 22 2c 20 20 20 20 20 20 20 20 20 53  STEP",         S
eda0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
edb0: 5f 56 4d 5f 53 54 45 50 20 20 20 20 20 20 20 20  _VM_STEP        
edc0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20 6f   },.  };.  if( o
edd0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
ede0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
edf0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
ee00: 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52 20  "STMT PARAMETER 
ee10: 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20 20  RESETFLAG");.   
ee20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ee30: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
ee40: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
ee50: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
ee60: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
ee70: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
ee80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61 6d  _ERROR;.  zOpNam
ee90: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
eea0: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f  g(objv[2]);.  fo
eeb0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
eec0: 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  ze(aOp); i++){. 
eed0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 4f     if( strcmp(aO
eee0: 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70 4e  p[i].zName, zOpN
eef0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
ef00: 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70 3b   op = aOp[i].op;
ef10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ef20: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
ef30: 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 20  =ArraySize(aOp) 
ef40: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
ef50: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
ef60: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
ef70: 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  p) ) return TCL_
ef80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
ef90: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
efa0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
efb0: 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46 6c  bjv[3], &resetFl
efc0: 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ag) ) return TCL
efd0: 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75 65  _ERROR;.  iValue
efe0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
eff0: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f 70  status(pStmt, op
f000: 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 20  , resetFlag);.  
f010: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
f020: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
f030: 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29 3b  IntObj(iValue));
f040: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f050: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
f060: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
f070: 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a 2a 2a 20  CANSTATUS./*.** 
f080: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
f090: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 20  stmt_scanstatus 
f0a0: 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73 74 61 74  STMT IDX.*/.stat
f0b0: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
f0c0: 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20 76  _scanstatus(.  v
f0d0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
f0e0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
f0f0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
f100: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
f110: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
f120: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
f130: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
f140: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
f150: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b  nt */.  int idx;
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
f180: 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a 20  d argument */.. 
f190: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
f1a0: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
f1b0: 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73 71   *zExplain;.  sq
f1c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f  lite3_int64 nLoo
f1d0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  p;.  sqlite3_int
f1e0: 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f 75  64 nVisit;.  dou
f1f0: 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74 20  ble rEst;.  int 
f200: 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  res;..  if( objc
f210: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
f220: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f230: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
f240: 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72 65  MT IDX");.    re
f250: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f260: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
f270: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
f280: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f290: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
f2a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f2b0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
f2c0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
f2d0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
f2e0: 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
f2f0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20 3d  _ERROR;..  res =
f300: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
f310: 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20  anstatus(pStmt, 
f320: 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  idx, SQLITE_SCAN
f330: 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69  STAT_NLOOP, (voi
f340: 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69 66  d*)&nLoop);.  if
f350: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
f360: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
f370: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
f380: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f390: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f3a0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f3b0: 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d 31  gObj("nLoop", -1
f3c0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f3d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f3e0: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f3f0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f 6f  wWideIntObj(nLoo
f400: 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p));.    sqlite3
f410: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
f420: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c  (pStmt, idx, SQL
f430: 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49  ITE_SCANSTAT_NVI
f440: 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69  SIT, (void*)&nVi
f450: 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  sit);.    Tcl_Li
f460: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f470: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f480: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 56  NewStringObj("nV
f490: 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20  isit", -1));.   
f4a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f4b0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
f4c0: 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  t, Tcl_NewWideIn
f4d0: 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a 20  tObj(nVisit));. 
f4e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
f4f0: 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74  scanstatus(pStmt
f500: 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43  , idx, SQLITE_SC
f510: 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69  ANSTAT_EST, (voi
f520: 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 54  d*)&rEst);.    T
f530: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f540: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f550: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f560: 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b 0a  j("nEst", -1));.
f570: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f580: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
f590: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f 75  pRet, Tcl_NewDou
f5a0: 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a 20  bleObj(rEst));. 
f5b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
f5c0: 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74  scanstatus(pStmt
f5d0: 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43  , idx, SQLITE_SC
f5e0: 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76 6f  ANSTAT_NAME, (vo
f5f0: 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20 20  id*)&zName);.   
f600: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f610: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
f620: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
f630: 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31 29  Obj("zName", -1)
f640: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
f650: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f660: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
f670: 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c  StringObj(zName,
f680: 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69 74   -1));.    sqlit
f690: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f6a0: 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53  us(pStmt, idx, S
f6b0: 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45  QLITE_SCANSTAT_E
f6c0: 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26  XPLAIN, (void*)&
f6d0: 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 54  zExplain);.    T
f6e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f6f0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f700: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f710: 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d 31  j("zExplain", -1
f720: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f730: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f740: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f750: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70 6c  wStringObj(zExpl
f760: 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ain, -1));.    T
f770: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
f780: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
f790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
f7a0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
f7b0: 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rp);.  }.  retur
f7c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
f7d0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f7e0: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f7f0: 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a 2a  us_reset  STMT.*
f800: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
f810: 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  t_stmt_scanstatu
f820: 73 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20  s_reset(.  void 
f830: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
f840: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
f850: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
f860: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
f870: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
f880: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
f890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f8a0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a  First argument *
f8b0: 2f 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  /.  if( objc!=2 
f8c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
f8d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f8e0: 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
f8f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f900: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
f910: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
f920: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
f930: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
f940: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
f950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
f960: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
f970: 73 74 61 74 75 73 5f 72 65 73 65 74 28 70 53 74  status_reset(pSt
f980: 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  mt);.  return TC
f990: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
f9a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f9b0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a  ABLE_SQLLOG./*.*
f9c0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
f9d0: 33 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a  3_config_sqllog.
f9e0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 53  **.** Zero the S
f9f0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
fa00: 4c 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  LOG configuratio
fa10: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
fa20: 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c  test_config_sqll
fa30: 6f 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  og(.  void * cli
fa40: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
fa50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
fa60: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
fa70: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
fa80: 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  [].){.  if( objc
fa90: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
faa0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fab0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
fac0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
fad0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
fae0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
faf0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
fb00: 47 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  G, 0, 0);.  retu
fb10: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
fb20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
fb30: 3a 20 76 66 73 5f 63 75 72 72 65 6e 74 5f 74 69  : vfs_current_ti
fb40: 6d 65 5f 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52  me_int64.**.** R
fb50: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
fb60: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
fb70: 64 65 66 61 75 6c 74 20 56 46 53 27 73 20 78 43  default VFS's xC
fb80: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
fb90: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
fba0: 63 20 69 6e 74 20 76 66 73 43 75 72 72 65 6e 74  c int vfsCurrent
fbb0: 54 69 6d 65 49 6e 74 36 34 28 0a 20 20 76 6f 69  TimeInt64(.  voi
fbc0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
fbd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
fbe0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
fbf0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
fc00: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
fc10: 36 34 20 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  64 t;.  sqlite3_
fc20: 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69  vfs *pVfs = sqli
fc30: 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
fc40: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
fc50: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
fc60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fc70: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
fc80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fc90: 52 3b 0a 20 20 7d 0a 20 20 70 56 66 73 2d 3e 78  R;.  }.  pVfs->x
fca0: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
fcb0: 28 70 56 66 73 2c 20 26 74 29 3b 0a 20 20 54 63  (pVfs, &t);.  Tc
fcc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
fcd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
fce0: 64 65 49 6e 74 4f 62 6a 28 74 29 29 3b 0a 20 20  deIntObj(t));.  
fcf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
fd00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fd10: 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
fd20: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
fd30: 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
fd40: 74 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73  t DB DBNAME.*/.s
fd50: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
fd60: 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 76  napshot_get(.  v
fd70: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
fd80: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
fd90: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
fda0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
fdb0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
fdc0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
fdd0: 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
fde0: 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  zName;.  sqlite3
fdf0: 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
fe00: 73 68 6f 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  shot = 0;..  if(
fe10: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
fe20: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fe30: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
fe40: 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a  , "DB DBNAME");.
fe50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fe60: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
fe70: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
fe80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
fe90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
fea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
feb0: 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  RROR;.  zName = 
fec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
fed0: 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20  jv[2]);..  rc = 
fee0: 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
fef0: 5f 67 65 74 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  _get(db, zName, 
ff00: 26 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 69  &pSnapshot);.  i
ff10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ff20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
ff30: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
ff40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ff50: 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  j(sqlite3ErrName
ff60: 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  (rc), -1));.    
ff70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
ff90: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
ffa0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
ffb0: 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
ffc0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
ffd0: 53 6e 61 70 73 68 6f 74 29 20 29 20 72 65 74 75  Snapshot) ) retu
ffe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fff0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10000 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
10010 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 75 66  ewStringObj(zBuf
10020 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65  , -1));.  }.  re
10030 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
10040 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10050 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20  ENABLE_SNAPSHOT 
10060 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
10070 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
10080 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  T./*.** Usage: s
10090 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
100a0 6f 70 65 6e 20 44 42 20 44 42 4e 41 4d 45 20 53  open DB DBNAME S
100b0 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61 74 69  NAPSHOT.*/.stati
100c0 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 61 70 73  c int test_snaps
100d0 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64  hot_open(.  void
100e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
100f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10100 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10110 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10120 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
10130 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
10140 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  *db;.  char *zNa
10150 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  me;.  sqlite3_sn
10160 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
10170 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
10180 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
10190 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
101a0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
101b0 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 22 29  BNAME SNAPSHOT")
101c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
101d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
101e0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
101f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10200 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10210 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
10220 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20  _ERROR;.  zName 
10230 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
10240 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 70 53 6e 61  objv[2]);.  pSna
10250 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74 65 33  pshot = (sqlite3
10260 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74  _snapshot*)sqlit
10270 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
10280 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10290 6a 76 5b 33 5d 29 29 3b 0a 0a 20 20 72 63 20 3d  jv[3]));..  rc =
102a0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
102b0 74 5f 6f 70 65 6e 28 64 62 2c 20 7a 4e 61 6d 65  t_open(db, zName
102c0 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20  , pSnapshot);.  
102d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
102e0 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
102f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
10300 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10310 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  bj(sqlite3ErrNam
10320 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20  e(rc), -1));.   
10330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10340 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
10350 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
10360 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
10370 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23  E_SNAPSHOT */..#
10380 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10390 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a  BLE_SNAPSHOT./*.
103a0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
103b0 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 20  3_snapshot_free 
103c0 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61 74  SNAPSHOT.*/.stat
103d0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 61 70  ic int test_snap
103e0 73 68 6f 74 5f 66 72 65 65 28 0a 20 20 76 6f 69  shot_free(.  voi
103f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10400 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10410 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10420 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10430 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
10440 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
10450 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 20 20 69 66  *pSnapshot;.  if
10460 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10470 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10480 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
10490 76 2c 20 22 53 4e 41 50 53 48 4f 54 22 29 3b 0a  v, "SNAPSHOT");.
104a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
104b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 53 6e 61  RROR;.  }.  pSna
104c0 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74 65 33  pshot = (sqlite3
104d0 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74  _snapshot*)sqlit
104e0 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
104f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10500 6a 76 5b 31 5d 29 29 3b 0a 20 20 73 71 6c 69 74  jv[1]));.  sqlit
10510 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65  e3_snapshot_free
10520 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 72  (pSnapshot);.  r
10530 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10540 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10550 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10560 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
10570 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
10580 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  OT./*.** Usage: 
10590 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
105a0 5f 63 6d 70 20 53 4e 41 50 53 48 4f 54 31 20 53  _cmp SNAPSHOT1 S
105b0 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74 61 74  NAPSHOT2.*/.stat
105c0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 61 70  ic int test_snap
105d0 73 68 6f 74 5f 63 6d 70 28 0a 20 20 76 6f 69 64  shot_cmp(.  void
105e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
105f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10600 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10610 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10620 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
10630 74 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  t res;.  sqlite3
10640 5f 73 6e 61 70 73 68 6f 74 20 2a 70 31 3b 0a 20  _snapshot *p1;. 
10650 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10660 74 20 2a 70 32 3b 0a 20 20 69 66 28 20 6f 62 6a  t *p2;.  if( obj
10670 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
10680 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10690 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
106a0 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f  NAPSHOT1 SNAPSHO
106b0 54 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  T2");.    return
106c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
106d0 20 20 70 31 20 3d 20 28 73 71 6c 69 74 65 33 5f    p1 = (sqlite3_
106e0 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65  snapshot*)sqlite
106f0 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54  3TestTextToPtr(T
10700 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10710 76 5b 31 5d 29 29 3b 0a 20 20 70 32 20 3d 20 28  v[1]));.  p2 = (
10720 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10730 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  *)sqlite3TestTex
10740 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
10750 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a  ring(objv[2]));.
10760 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f    res = sqlite3_
10770 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28 70 31 2c  snapshot_cmp(p1,
10780 20 70 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   p2);.  Tcl_SetO
10790 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
107a0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
107b0 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  es));.  return T
107c0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
107d0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
107e0 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 2f 2a  _SNAPSHOT */../*
107f0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
10800 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44  te3_next_stmt  D
10810 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  B  STMT.**.** Re
10820 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 73 74  turn the next st
10830 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75 65 6e  atment in sequen
10840 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a  ce after STMT..*
10850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
10860 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20 76  t_next_stmt(.  v
10870 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10880 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10890 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
108a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
108b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
108c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
108d0 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  Stmt;.  sqlite3 
108e0 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  *db = 0;.  char 
108f0 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28  zBuf[50];..  if(
10900 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
10910 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10920 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
10930 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
10940 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
10950 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10960 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
10970 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29 3b   " DB STMT", 0);
10980 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10990 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
109a0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
109b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
109c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
109d0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
109e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65  _ERROR;.  if( ge
109f0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10a00 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10a10 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53  ng(objv[2]), &pS
10a20 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10a30 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74  L_ERROR;.  pStmt
10a40 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f   = sqlite3_next_
10a50 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29 3b  stmt(db, pStmt);
10a60 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
10a70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
10a80 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
10a90 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
10aa0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10ab0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
10ac0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10ad0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
10ae0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
10af0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
10b00 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
10b10 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53  stmt_readonly  S
10b20 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
10b30 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73   true if STMT is
10b40 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
10b50 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
10b60 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
10b70 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
10b80 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 64  d to leave the d
10b90 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66 69  atabase unmodifi
10ba0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
10bb0 74 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64  t test_stmt_read
10bc0 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  only(.  void * c
10bd0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10be0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10bf0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10c00 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10c10 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10c20 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
10c30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
10c40 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10c50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10c60 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10c70 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10c80 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
10c90 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10ca0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10cb0 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
10cc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10cd0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
10ce0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10cf0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10d00 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10d10 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10d20 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
10d30 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
10d40 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20  donly(pStmt);.  
10d50 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10d60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
10d70 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b  BooleanObj(rc));
10d80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
10d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
10da0 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  :  sqlite3_stmt_
10db0 62 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  busy  STMT.**.**
10dc0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
10dd0 53 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55  STMT is a non-NU
10de0 4c 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  LL pointer to a 
10df0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61  statement.** tha
10e00 74 20 68 61 73 20 62 65 65 6e 20 73 74 65 70 70  t has been stepp
10e10 65 64 20 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f  ed but not to co
10e20 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  mpletion..*/.sta
10e30 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
10e40 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64 20 2a  t_busy(.  void *
10e50 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10e60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10e70 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10e80 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
10e90 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
10ea0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
10eb0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
10ec0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10ed0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10ee0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10ef0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10f00 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10f10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10f20 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10f30 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
10f40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10f50 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
10f60 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
10f70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10f80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10f90 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10fa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
10fb0 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  = sqlite3_stmt_b
10fc0 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63  usy(pStmt);.  Tc
10fd0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10fe0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
10ff0 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20  oleanObj(rc));. 
11000 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11010 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
11020 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e   uses_stmt_journ
11030 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  al  STMT.**.** R
11040 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54  eturn true if ST
11050 4d 54 20 75 73 65 73 20 61 20 73 74 61 74 65 6d  MT uses a statem
11060 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
11070 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 73 5f  static int uses_
11080 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20  stmt_journal(.  
11090 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
110a0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
110b0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
110c0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
110d0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
110e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
110f0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
11100 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
11110 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11120 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
11130 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
11140 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
11150 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11160 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
11170 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
11180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11190 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
111a0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
111b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
111c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
111d0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
111e0 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
111f0 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70  _stmt_readonly(p
11200 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
11210 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11220 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
11230 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70 53 74  Obj(((Vdbe *)pSt
11240 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  mt)->usesStmtJou
11250 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rnal));.  return
11260 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
11270 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
11280 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a  e3_reset  STMT .
11290 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 74  **.** Reset a st
112a0 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
112b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
112c0 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64  st_reset(.  void
112d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
112e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
112f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
11300 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
11310 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
11320 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
11330 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
11340 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
11350 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11360 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
11370 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
11380 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
11390 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
113a0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
113b0 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
113c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
113d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
113e0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
113f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
11400 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11410 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
11420 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
11430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
11440 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  eset(pStmt);.  i
11450 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69  f( pStmt && sqli
11460 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
11470 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
11480 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20  pStmt), rc) ){. 
11490 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
114a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  ROR;.  }.  Tcl_S
114b0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
114c0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
114d0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
114e0 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20  ATIC);./*.  if( 
114f0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
11500 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11510 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
11520 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
11530 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 70  ge:  sqlite3_exp
11540 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ired STMT .**.**
11550 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
11560 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  a recompilation 
11570 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
11580 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e   is recommended.
11590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
115a0 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76  est_expired(.  v
115b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
115c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
115d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
115e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
115f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
11600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11610 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
11620 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11630 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  tmt;.  if( objc!
11640 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
11650 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11660 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11670 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11680 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
11690 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
116a0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
116b0 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
116c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
116d0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
116e0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
116f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11700 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
11710 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11720 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
11730 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
11740 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
11750 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65  j(sqlite3_expire
11760 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64  d(pStmt)));.#end
11770 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
11780 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
11790 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61  ge:  sqlite3_tra
117a0 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46  nsfer_bindings F
117b0 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a  ROMSTMT TOSTMT.*
117c0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c  *.** Transfer al
117d0 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20  l bindings from 
117e0 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f  FROMSTMT over to
117f0 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69   TOSTMT.*/.stati
11800 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e 73  c int test_trans
11810 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64  fer_bind(.  void
11820 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
11830 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11840 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
11850 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
11860 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
11870 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11880 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c  DEPRECATED.  sql
11890 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
118a0 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66  1, *pStmt2;.  if
118b0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
118c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
118d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
118e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
118f0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
11900 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11910 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
11920 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f  , " FROM-STMT TO
11930 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20  -STMT", 0);.    
11940 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11950 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
11960 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
11970 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11980 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
11990 74 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t1)) return TCL_
119a0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74  ERROR;.  if( get
119b0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
119c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
119d0 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74  g(objv[2]), &pSt
119e0 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c  mt2)) return TCL
119f0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
11a00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11a10 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77  p, .     Tcl_New
11a20 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74  IntObj(sqlite3_t
11a30 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
11a40 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29  (pStmt1,pStmt2))
11a50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
11a60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
11a70 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
11a80 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a  te3_changes DB.*
11a90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11aa0 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
11ab0 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
11ac0 74 61 62 61 73 65 20 62 79 20 74 68 65 20 6c 61  tabase by the la
11ad0 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74  st SQL.** execut
11ae0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
11af0 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28  nt test_changes(
11b00 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
11b10 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
11b20 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
11b30 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
11b40 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
11b50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
11b60 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
11b70 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
11b80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11b90 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
11ba0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
11bb0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
11bc0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
11bd0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
11be0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11bf0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
11c00 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
11c10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11c20 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
11c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11c40 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
11c50 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
11c60 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
11c70 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20  hanges(db)));.  
11c80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11c90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
11ca0 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64  the "static_bind
11cb0 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61 72  _value" that var
11cc0 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64  iables are bound
11cd0 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20   to when.** the 
11ce0 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73  FLAG option of s
11cf0 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22  qlite3_bind is "
11d00 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69  static".*/.stati
11d10 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73  c char *sqlite_s
11d20 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
11d30 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
11d40 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
11d50 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a  ind_nbyte = 0;..
11d60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
11d70 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20  lite3_bind  VM  
11d80 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47  IDX  VALUE  FLAG
11d90 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65  S.**.** Sets the
11da0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44   value of the ID
11db0 58 2d 74 68 20 6f 63 63 75 72 72 65 6e 63 65 20  X-th occurrence 
11dc0 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72  of "?" in the or
11dd0 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74  iginal SQL.** st
11de0 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20  ring.  VALUE is 
11df0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20  the new value.  
11e00 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22  If FLAGS=="null"
11e10 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a   then VALUE is.*
11e20 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68  * ignored and th
11e30 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
11e40 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47  o NULL.  If FLAG
11e50 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e  S=="static" then
11e60 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73  .** the value is
11e70 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
11e80 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61  e of a static va
11e90 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20  riable named.** 
11ea0 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
11eb0 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20  ind_value".  If 
11ec0 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20  FLAGS=="normal" 
11ed0 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  then a copy.** o
11ee0 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d  f the VALUE is m
11ef0 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ade.  If FLAGS==
11f00 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61 20  "blob10" then a 
11f10 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65 64  VALUE is ignored
11f20 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74 65  .** an a 10-byte
11f30 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78 79   blob "abc\000xy
11f40 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73 65  z\000pq" is inse
11f50 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rted..*/.static 
11f60 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20  int test_bind(. 
11f70 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
11f80 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11f90 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
11fa0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
11fb0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
11fc0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
11fd0 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
11fe0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11ff0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
12000 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
12010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
12020 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
12030 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
12040 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
12050 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
12060 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  dx;.  if( argc!=
12070 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
12080 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12090 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
120a0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
120b0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
120c0 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20   " VM IDX VALUE 
120d0 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72  (null|static|nor
120e0 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20  mal)\"", 0);.   
120f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12100 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
12110 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
12120 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53  rp, argv[1], &pS
12130 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
12140 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
12150 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
12160 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29  , argv[2], &idx)
12170 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12180 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  ROR;.  if( strcm
12190 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22  p(argv[4],"null"
121a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
121b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
121c0 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
121d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
121e0 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74  mp(argv[4],"stat
121f0 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ic")==0 ){.    r
12200 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
12210 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
12220 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  , sqlite_static_
12230 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20  bind_value, -1, 
12240 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
12250 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
12260 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d  static-nbytes")=
12270 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
12280 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
12290 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
122a0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
122b0 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  value,.         
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
122e0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
122f0 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65  _nbyte, 0);.  }e
12300 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
12310 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29  rgv[4],"normal")
12320 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
12330 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
12340 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72  t(pStmt, idx, ar
12350 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[3], -1, SQLIT
12360 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
12370 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12380 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30  (argv[4],"blob10
12390 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
123a0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
123b0 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
123c0 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70  "abc\000xyz\000p
123d0 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53  q", 10, SQLITE_S
123e0 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
123f0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
12400 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34  esult(interp, "4
12410 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  th argument shou
12420 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
12430 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73  "\"null\" or \"s
12440 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72  tatic\" or \"nor
12450 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  mal\"", 0);.    
12460 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12470 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
12480 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
12490 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
124a0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
124b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
124c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
124d0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
124e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
124f0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
12500 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  , zBuf, "(%d) ",
12510 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
12520 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12530 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
12540 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
12550 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12560 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
12570 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
12580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12590 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73  T_UTF16./*.** Us
125a0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
125b0 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c  llate <db ptr> <
125c0 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
125d0 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20  <utf16be>.**.** 
125e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
125f0 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
12600 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  at SQLite select
12610 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  s the correct co
12620 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65  llation.** seque
12630 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  nce callback whe
12640 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
12650 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
12660 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
12670 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
12680 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
12690 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
126a0 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63 6f  registers the co
126b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
126c0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a   "test_collate".
126d0 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ** with database
126e0 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68   handle <db>. Th
126f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12700 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74  t must be a list
12710 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f   of three.** boo
12720 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20  lean values. If 
12730 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75  the first is tru
12740 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
12750 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  n of test_collat
12760 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72  e is.** register
12770 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
12780 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74   the second is t
12790 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
127a0 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
127b0 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  .** UTF-16le, if
127c0 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74 72   the third is tr
127d0 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76  ue, a UTF-16be v
127e0 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
127f0 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73  ble..** Previous
12800 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73   versions of tes
12810 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65  t_collate are de
12820 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
12830 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12840 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  nce test_collate
12850 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
12860 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a  by calling the.*
12870 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  * following TCL 
12880 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
12890 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65  "test_collate <e
128a0 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22  nc> <lhs> <rhs>"
128b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e  .**.** The <lhs>
128c0 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74   and <rhs> are t
128d0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65  he two values be
128e0 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e  ing compared, en
128f0 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  coded in UTF-8..
12900 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72  ** The <enc> par
12910 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 6e  ameter is the en
12920 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f  coding of the co
12930 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
12940 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20   that.** SQLite 
12950 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c  selected to call
12960 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20 73  . The TCL test s
12970 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73  cript implements
12980 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f   the.** "test_co
12990 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a  llate" proc..**.
129a0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
129b0 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b  s will only work
129c0 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 72 70   with one interp
129d0 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
129e0 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
129f0 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
12a00 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
12a10 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
12a20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
12a30 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
12a40 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
12a50 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
12a60 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
12a70 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
12a80 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
12a90 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
12aa0 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
12ab0 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
12ac0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
12ad0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
12ae0 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
12af0 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
12b00 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  in = SQLITE_PTR_
12b10 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20  TO_INT(pCtx);.  
12b20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
12b30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
12b40 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f  ue *pVal;.  Tcl_
12b50 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d  Obj *pX;..  pX =
12b60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12b70 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  j("test_collate"
12b80 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
12b90 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a  rRefCount(pX);..
12ba0 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20    switch( encin 
12bb0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
12bc0 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54  TE_UTF8:.      T
12bd0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12be0 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
12bf0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
12c00 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20  TF-8",-1));.    
12c10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12c20 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  e SQLITE_UTF16LE
12c30 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
12c40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12c50 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
12c60 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
12c70 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
12c80 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
12c90 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20  LITE_UTF16BE:.  
12ca0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
12cb0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
12cc0 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
12cd0 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31  bj("UTF-16BE",-1
12ce0 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
12cf0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
12d00 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
12d10 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67   }..  sqlite3Beg
12d20 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
12d30 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
12d40 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
12d50 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
12d60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12d70 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41  Str(pVal, nA, zA
12d80 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
12d90 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
12da0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
12db0 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
12dc0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12dd0 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
12de0 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
12df0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
12e00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12e10 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
12e20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12e30 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42  Str(pVal, nB, zB
12e40 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
12e50 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
12e60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
12e70 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
12e80 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12e90 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
12ea0 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
12eb0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
12ec0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12ed0 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
12ee0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
12ef0 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e(pVal);.  }.  s
12f00 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
12f10 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f  alloc();..  Tcl_
12f20 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c  EvalObjEx(i, pX,
12f30 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
12f40 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
12f50 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12f60 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  (i, Tcl_GetObjRe
12f70 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a  sult(i), &res);.
12f80 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
12f90 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
12fa0 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  collate(.  void 
12fb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12fc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12fd0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
12fe0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
12ff0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
13000 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
13010 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  val;.  sqlite3_v
13020 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
13030 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
13040 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=5 ) goto bad_
13050 61 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c  args;.  pTestCol
13060 6c 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74  lateInterp = int
13070 65 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62  erp;.  if( getDb
13080 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
130a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
130b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
130c0 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
130d0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
130e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
130f0 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
13100 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13110 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13120 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
13130 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
13140 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  te", SQLITE_UTF8
13150 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f  , .          (vo
13160 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38  id *)SQLITE_UTF8
13170 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
13180 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66  te_func:0);.  if
13190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
131a0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  ){.    const voi
131b0 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69  d *zUtf16;.    i
131c0 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
131d0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
131e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
131f0 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
13200 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13210 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
13220 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
13230 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
13240 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
13250 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
13260 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
13270 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16LE, val?test_
13280 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
13290 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
132a0 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
132b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
132c0 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[4], &val) ) 
132d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
132e0 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28  ;..#if 0.    if(
132f0 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
13300 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  Fail>0 ){.      
13310 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
13320 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  ail++;.    }.#en
13330 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
13340 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
13350 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c  mutex);.    pVal
13360 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
13370 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
13380 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
13390 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63  Val, -1, "test_c
133a0 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
133b0 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
133c0 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36  TIC);.    zUtf16
133d0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
133e0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
133f0 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
13400 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
13410 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
13420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
13430 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
13440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13450 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13460 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c  on16(db, zUtf16,
13470 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
13480 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
13490 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
134a0 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  BE, val?test_col
134b0 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
134c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
134d0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
134e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
134f0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
13500 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  x);.  }.  if( sq
13510 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
13520 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
13530 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13540 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63  ROR;.  .  if( rc
13550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13560 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13570 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
13580 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
13590 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
135a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
135b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
135c0 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
135d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
135e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
135f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
13600 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ",.      Tcl_Get
13610 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
13620 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42  jv[0], 0), " <DB
13630 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
13640 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30  e> <utf16be>", 0
13650 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
13660 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
13670 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
13680 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
13690 20 3c 64 62 20 70 74 72 3e 0a 2a 2a 0a 2a 2a 20   <db ptr>.**.** 
136a0 41 64 64 20 61 20 75 74 66 2d 31 36 20 63 6f 6c  Add a utf-16 col
136b0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
136c0 6e 61 6d 65 64 20 22 75 74 66 31 36 62 69 6e 22  named "utf16bin"
136d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
136e0 0a 2a 2a 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  .** handle. This
136f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13700 6e 63 65 20 63 6f 6d 70 61 72 65 73 20 61 72 67  nce compares arg
13710 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 61  uments in the sa
13720 6d 65 20 77 61 79 20 61 73 20 74 68 65 0a 2a 2a  me way as the.**
13730 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
13740 69 6f 6e 20 22 62 69 6e 61 72 79 22 2e 0a 2a 2f  ion "binary"..*/
13750 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
13760 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
13770 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  e_func(.  void *
13780 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c  pCtx, .  int nA,
13790 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
137a0 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74  .  int nB, const
137b0 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 69   void *zB.){.  i
137c0 6e 74 20 6e 43 6d 70 20 3d 20 28 6e 41 3e 6e 42  nt nCmp = (nA>nB
137d0 20 3f 20 6e 42 20 3a 20 6e 41 29 3b 0a 20 20 69   ? nB : nA);.  i
137e0 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
137f0 7a 41 2c 20 7a 42 2c 20 6e 43 6d 70 29 3b 0a 20  zA, zB, nCmp);. 
13800 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
13810 73 20 3d 20 6e 41 20 2d 20 6e 42 3b 0a 20 20 72  s = nA - nB;.  r
13820 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61  eturn res;.}.sta
13830 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 74 66  tic int test_utf
13840 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 28 0a 20  16bin_collate(. 
13850 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
13860 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
13870 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
13880 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
13890 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
138a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
138b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
138c0 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20   objc!=2 ) goto 
138d0 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
138e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
138f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
13900 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
13910 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13920 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
13930 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13940 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31  lation(db, "utf1
13950 36 62 69 6e 22 2c 20 53 51 4c 49 54 45 5f 55 54  6bin", SQLITE_UT
13960 46 31 36 2c 20 30 2c 20 0a 20 20 20 20 20 20 74  F16, 0, .      t
13970 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
13980 6c 61 74 65 5f 66 75 6e 63 0a 20 20 29 3b 0a 20  late_func.  );. 
13990 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
139a0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
139b0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
139c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
139d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
139e0 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72  d_args:.  Tcl_Wr
139f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13a00 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
13a10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
13a20 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
13a30 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69  When the collati
13a40 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61  on needed callba
13a50 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72  ck is invoked, r
13a60 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f  ecord the name o
13a70 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  f .** the reques
13a80 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ted collating fu
13a90 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68  nction here.  Th
13aa0 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20  e recorded name 
13ab0 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20  is linked.** to 
13ac0 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61  a TCL variable a
13ad0 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  nd used to make 
13ae0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
13af0 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
13b00 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72  n.** name is cor
13b10 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
13b20 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  char zNeededColl
13b30 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74  ation[200];.stat
13b40 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65  ic char *pzNeede
13b50 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65  dCollation = zNe
13b60 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a  ededCollation;..
13b70 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
13b80 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  en a collating s
13b90 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65  equence is neede
13ba0 64 2e 20 20 52 65 67 69 73 74 65 72 65 64 20 75  d.  Registered u
13bb0 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
13bc0 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
13bd0 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  16()..*/.static 
13be0 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74  void test_collat
13bf0 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76  e_needed_cb(.  v
13c00 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71  oid *pCtx, .  sq
13c10 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
13c20 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e   eTextRep,.  con
13c30 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29  st void *pName.)
13c40 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e  {.  int enc = EN
13c50 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  C(db);.  int i;.
13c60 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72    char *z;.  for
13c70 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d  (z = (char*)pNam
13c80 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b  e, i=0; *z || z[
13c90 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  1]; z++){.    if
13ca0 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f  ( *z ) zNeededCo
13cb0 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a  llation[i++] = *
13cc0 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64  z;.  }.  zNeeded
13cd0 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30  Collation[i] = 0
13ce0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
13cf0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
13d00 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f      db, "test_co
13d10 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c  llate", ENC(db),
13d20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
13d30 54 52 28 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f  TR(enc), test_co
13d40 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a  llate_func);.}..
13d50 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
13d60 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65  _test_collate_ne
13d70 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69  eded DB.*/.stati
13d80 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61  c int test_colla
13d90 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69  te_needed(.  voi
13da0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
13db0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
13dc0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
13dd0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
13de0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
13df0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
13e00 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
13e10 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=2 ) goto bad_
13e20 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44  args;.  if( getD
13e30 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
13e40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
13e50 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
13e60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13e80 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
13e90 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f  d16(db, 0, test_
13ea0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
13eb0 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c  b);.  zNeededCol
13ec0 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20  lation[0] = 0;. 
13ed0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
13ee0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
13ef0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
13f00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
13f10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
13f20 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72  d_args:.  Tcl_Wr
13f30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13f40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
13f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
13f60 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
13f70 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c  tclcmd:   add_al
13f80 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
13f90 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a  lations  DB.**.*
13fa0 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f  * Add two new co
13fb0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13fc0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
13fd0 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75  e DB.**.**     u
13fe0 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20  tf16_aligned.** 
13ff0 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67      utf16_unalig
14000 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63  ned.**.** Both c
14010 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
14020 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  es use the same 
14030 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49  sort order as BI
14040 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  NARY..** The onl
14050 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  y difference is 
14060 74 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61  that the utf16_a
14070 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  ligned collating
14080 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20  .** sequence is 
14090 64 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68  declared with th
140a0 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  e SQLITE_UTF16_A
140b0 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20  LIGNED flag..** 
140c0 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66  Both collating f
140d0 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65  unctions increme
140e0 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  nt the unaligned
140f0 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a   utf16 counter.*
14100 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20  * whenever they 
14110 73 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  see a string tha
14120 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f  t begins on an o
14130 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79  dd byte boundary
14140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14150 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
14160 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74  _counter = 0;.st
14170 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65  atic int alignme
14180 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  ntCollFunc(.  vo
14190 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
141a0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
141b0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
141c0 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
141d0 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
141e0 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
141f0 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
14200 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
14210 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20   if( nKey1>0 && 
14220 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54  1==(1&(SQLITE_PT
14230 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29  R_TO_INT(pKey1))
14240 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
14250 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
14260 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26    if( nKey2>0 &&
14270 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50   1==(1&(SQLITE_P
14280 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29  TR_TO_INT(pKey2)
14290 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73  )) ) unaligned_s
142a0 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b  tring_counter++;
142b0 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
142c0 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
142d0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
142e0 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
142f0 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65   nKey2;.  }.  re
14300 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
14310 63 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d  c int add_alignm
14320 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69  ent_test_collati
14330 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ons(.  void * cl
14340 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14350 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14360 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14370 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14380 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14390 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63   *db;.  if( objc
143a0 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67  >=2 ){.    if( g
143b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
143c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
143d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
143e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
143f0 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
14400 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
14410 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61  n(db, "utf16_una
14420 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f  ligned", SQLITE_
14430 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20  UTF16, .        
14440 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
14450 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  Func);.    sqlit
14460 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
14470 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61  ion(db, "utf16_a
14480 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f  ligned", SQLITE_
14490 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a  UTF16_ALIGNED, .
144a0 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e          0, align
144b0 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20  mentCollFunc);. 
144c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
144d0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
144e0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
144f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a  TE_OMIT_UTF16) *
14500 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  /../*.** Usage: 
14510 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
14520 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38  n <db ptr> <utf8
14530 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
14540 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  16be>.**.** This
14550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
14560 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  d to test that S
14570 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68  QLite selects th
14580 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a  e correct user.*
14590 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62  * function callb
145a0 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c  ack when multipl
145b0 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20  e versions (for 
145c0 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65  different text e
145d0 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65  ncodings).** are
145e0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
145f0 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
14600 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
14610 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72   up to three ver
14620 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65  sions of the use
14630 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74  r function.** "t
14640 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69  est_function" wi
14650 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
14660 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65  le <db>.  If the
14670 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14680 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
14690 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
146a0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20  est_function is 
146b0 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
146c0 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20  TF-8, if the.** 
146d0 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
146e0 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
146f0 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31  stered for UTF-1
14700 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72  6le, if the four
14710 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61  th is.** true, a
14720 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
14730 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  n is available. 
14740 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
14750 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75  ns of.** test_fu
14760 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74  nction are delet
14770 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73  ed..**.** The us
14780 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
14790 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
147a0 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  lling the follow
147b0 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
147c0 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75  **.**   "test_fu
147d0 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72  nction <enc> <ar
147e0 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  g>".**.** Where 
147f0 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20  <enc> is one of 
14800 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20  UTF-8, UTF-16LE 
14810 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20  or UTF16BE, and 
14820 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20  <arg> is the.** 
14830 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
14840 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51  passed to the SQ
14850 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  L function. The 
14860 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
14870 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72  y.** the TCL scr
14880 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74  ipt is used as t
14890 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
148a0 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  of the SQL funct
148b0 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61  ion. It.** is pa
148c0 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75  ssed to SQLite u
148d0 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f  sing UTF-16BE fo
148e0 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66  r a UTF-8 test_f
148f0 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38  unction(), UTF-8
14900 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36  .** for a UTF-16
14910 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  LE test_function
14920 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45  (), and UTF-16LE
14930 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e   for an implemen
14940 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70  tation that.** p
14950 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e  refers UTF-16BE.
14960 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14970 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
14980 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
14990 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20  unction_utf8(.  
149a0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
149b0 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
149c0 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
149d0 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
149e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
149f0 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
14a00 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
14a10 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
14a20 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
14a30 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
14a40 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
14a50 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
14a60 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
14a70 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
14a80 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
14a90 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
14aa0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14ab0 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
14ac0 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38  StringObj("UTF-8
14ad0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
14ae0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14af0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
14b00 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
14b10 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
14b20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14b30 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
14b40 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
14b50 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
14b60 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
14b70 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69  ount(pX);.  sqli
14b80 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
14b90 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72  pCtx, Tcl_GetStr
14ba0 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
14bb0 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ), -1, SQLITE_TR
14bc0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c  ANSIENT);.  pVal
14bd0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14be0 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
14bf0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
14c00 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
14c10 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
14c20 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
14c30 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
14c40 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
14c50 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
14c60 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
14c70 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56  alue_text16be(pV
14c80 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
14c90 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14ca0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14cb0 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
14cc0 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
14cd0 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28  unction_utf16le(
14ce0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
14cf0 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
14d00 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
14d10 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
14d20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14d30 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
14d40 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
14d50 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
14d60 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
14d70 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
14d80 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
14d90 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
14da0 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
14db0 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
14dc0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
14dd0 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
14de0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
14df0 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
14e00 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
14e10 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16LE", -1));. 
14e20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14e30 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14e40 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
14e50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
14e60 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
14e70 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
14e80 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
14e90 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
14ea0 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
14eb0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
14ec0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
14ed0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
14ee0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
14ef0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
14f00 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
14f10 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
14f20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
14f30 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
14f40 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
14f50 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73  xt(pCtx,(char*)s
14f60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14f70 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54  t(pVal),-1,SQLIT
14f80 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
14f90 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
14fa0 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  (pVal);.}.static
14fb0 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74   void test_funct
14fc0 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73  ion_utf16be(.  s
14fd0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
14fe0 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
14ff0 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
15000 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
15010 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15020 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
15030 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
15040 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
15050 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
15060 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
15070 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
15080 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
15090 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
150a0 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
150b0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
150c0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
150d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
150e0 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
150f0 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
15100 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  BE", -1));.  Tcl
15110 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15120 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
15130 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
15140 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
15150 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
15160 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
15170 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
15180 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
15190 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
151a0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56  fCount(pX);.  pV
151b0 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
151c0 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
151d0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
151e0 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53  al, -1, Tcl_GetS
151f0 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
15200 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49  rp), .      SQLI
15210 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
15220 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
15230 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
15240 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
15250 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
15260 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
15270 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
15280 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
15290 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78  lt_text16be(pCtx
152a0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
152b0 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
152c0 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
152d0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
152e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
152f0 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c  xt16le(pCtx, sql
15300 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
15310 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6le(pVal),.     
15320 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
15330 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
15340 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
15350 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15360 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
15370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15380 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  st_function(.  v
15390 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
153a0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
153b0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
153c0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
153d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
153e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
153f0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
15400 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
15410 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
15420 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
15430 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
15440 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
15450 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15460 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
15470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
15480 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
15490 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
154a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
154b0 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
154c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
154d0 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
154e0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
154f0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
15500 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
15510 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
15520 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
15530 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38  st_function_utf8
15540 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
15550 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
15560 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
15570 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
15580 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
15590 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
155a0 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  ( val ){.    sql
155b0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
155c0 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66  tion(db, "test_f
155d0 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c  unction", 1, SQL
155e0 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20  ITE_UTF16LE, .  
155f0 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
15600 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
15610 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  6le, 0, 0);.  }.
15620 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
15630 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
15640 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15650 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
15660 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15670 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
15680 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
15690 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
156a0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
156b0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
156c0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
156d0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
156e0 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20  tf16be, 0, 0);. 
156f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
15700 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20  _OK;.bad_args:. 
15710 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15720 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
15730 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
15740 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63  be \"",.      Tc
15750 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
15760 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
15770 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75  " <DB> <utf8> <u
15780 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
15790 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  >", 0);.#endif /
157a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
157b0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
157c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
157d0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20  .** Usage:      
157e0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
157f0 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65  errstr <err code
15800 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61  >.**.** Test tha
15810 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  t the english la
15820 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71  nguage string eq
15830 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71  uivalents for sq
15840 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73  lite error codes
15850 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68  .** are sane. Th
15860 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  e parameter is a
15870 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
15880 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  enting an sqlite
15890 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
158a0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
158b0 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d  list of two elem
158c0 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67  ents, the string
158d0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
158e0 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  of the.** error 
158f0 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67  code and the eng
15900 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
15910 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  planation..*/.st
15920 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
15930 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  rstr(.  void * c
15940 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
15950 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15960 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
15970 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
15980 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a  jv[].){.  char *
15990 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  zCode;.  int i;.
159a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
159b0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
159c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
159d0 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63   objv, "<error c
159e0 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a  ode>");.  }..  z
159f0 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Code = Tcl_GetSt
15a00 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
15a10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b   for(i=0; i<200;
15a20 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30   i++){.    if( 0
15a30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72  ==strcmp(t1Error
15a40 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20  Name(i), zCode) 
15a50 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ) break;.  }.  T
15a60 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
15a70 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
15a80 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30  ite3ErrStr(i), 0
15a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
15aa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
15ab0 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e  ge:    breakpoin
15ac0 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  t.**.** This rou
15ad0 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20  tine exists for 
15ae0 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f  one purpose - to
15af0 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65   provide a place
15b00 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65   to put a.** bre
15b10 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42  akpoint with GDB
15b20 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69   that can be tri
15b30 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c  ggered using TCL
15b40 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a   code.  The use.
15b50 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77  ** for this is w
15b60 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72  hen a particular
15b70 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28   test fails on (
15b80 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20  say) the 1485th 
15b90 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e  iteration..** In
15ba0 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   the TCL test sc
15bb0 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64  ript, we can add
15bc0 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a   code like this:
15bd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24  .**.**     if {$
15be0 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f  i==1485} breakpo
15bf0 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72  int.**.** Then r
15c00 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69  un testfixture i
15c10 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61  n the debugger a
15c20 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20  nd wait for the 
15c30 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a  breakpoint to.**
15c40 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64   fire.  Then add
15c50 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69  itional breakpoi
15c60 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74  nts can be set t
15c70 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65  o trace down the
15c80 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   bug..*/.static 
15c90 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  int test_breakpo
15ca0 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
15cb0 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
15cc0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
15cd0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
15ce0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
15cf0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
15d00 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
15d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15d20 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
15d30 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
15d40 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
15d50 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
15d60 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
15d70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
15d80 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
15d90 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
15da0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
15db0 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
15dc0 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
15dd0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
15de0 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
15df0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
15e00 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
15e10 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44  statement..** ID
15e20 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  X is the index o
15e30 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
15e40 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
15e50 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
15e60 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
15e70 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c   N-byte zero-fil
15e80 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  led BLOB to the 
15e90 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
15ea0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
15eb0 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f  d_zeroblob(.  vo
15ec0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
15ed0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15ee0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15ef0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15f00 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
15f10 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
15f20 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
15f30 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72    int n;.  int r
15f40 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
15f50 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
15f60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15f70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
15f80 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65   IDX N");.    re
15f90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15fa0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
15fb0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
15fc0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15fd0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
15fe0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15ff0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
16000 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16010 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
16020 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
16030 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
16040 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16050 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
16060 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
16070 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
16080 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a  = sqlite3_bind_z
16090 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  eroblob(pStmt, i
160a0 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
160b0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
160c0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
160d0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
160e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
160f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
16110 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16120 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16130 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16140 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
16150 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20 20  ind_zeroblob64  
16160 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a  STMT IDX N.**.**
16170 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
16180 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  3_bind_zeroblob6
16190 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
161a0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
161b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49   statement..** I
161c0 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  DX is the index 
161d0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
161e0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
161f0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
16200 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
16210 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69  a N-byte zero-fi
16220 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65  lled BLOB to the
16230 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
16240 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
16250 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 0a 20  nd_zeroblob64(. 
16260 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
16270 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
16280 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16290 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
162a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
162b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
162c0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
162d0 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  x;.  Tcl_WideInt
162e0 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   n;.  int rc;.. 
162f0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
16300 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16310 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
16320 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20  objv, "STMT IDX 
16330 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
16340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16350 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
16360 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16370 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16380 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
16390 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
163a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
163b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
163c0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
163d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
163e0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
163f0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
16400 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16410 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &n) ) return TC
16420 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
16430 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
16440 72 6f 62 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20  roblob64(pStmt, 
16450 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73  idx, n);.  if( s
16460 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
16470 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
16480 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
16490 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
164a0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
164b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
164c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
164d0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
164e0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
164f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16500 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
16510 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
16520 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
16530 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53  ite3_bind_int  S
16540 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
16550 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
16560 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65  e3_bind_int inte
16570 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
16580 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
16590 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
165a0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
165b0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
165c0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
165d0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
165e0 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74  * binds a 32-bit
165f0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
16600 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
16610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
16620 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20  est_bind_int(.  
16630 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16640 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16650 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16660 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
16670 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
16680 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16690 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
166a0 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20  ;.  int value;. 
166b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
166c0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
166d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
166e0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
166f0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
16700 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
16710 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
16720 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
16730 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
16740 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16750 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16760 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
16770 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16780 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16790 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
167a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
167b0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
167c0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
167d0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
167e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
167f0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
16800 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
16810 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
16820 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
16830 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
16840 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
16850 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
16860 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
16870 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
16880 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
16890 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
168a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
168b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
168c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
168d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
168e0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
168f0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
16900 67 65 3a 20 20 20 69 6e 74 61 72 72 61 79 5f 61  ge:   intarray_a
16910 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a  ddr  INT  ....**
16920 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
16930 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61  ddress of a C-la
16940 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66 20  nguage array of 
16950 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  32-bit integers.
16960 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
16970 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 69  hold the array i
16980 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
16990 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20  malloc().  Call 
169a0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f  this procedure o
169b0 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61  nce.** with no a
169c0 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65  rguments in orde
169d0 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  r to release mem
169e0 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  ory.  Each call 
169f0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  to this procedur
16a00 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  e.** overwrites 
16a10 74 68 65 20 70 72 65 76 69 6f 75 73 20 61 72 72  the previous arr
16a20 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
16a30 74 20 74 65 73 74 5f 69 6e 74 61 72 72 61 79 5f  t test_intarray_
16a40 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  addr(.  void * c
16a50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16a60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16a70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16a80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16a90 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
16aa0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 2a 70  .  static int *p
16ab0 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
16ac0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20  _free(p);.  p = 
16ad0 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20  0;.  if( objc>1 
16ae0 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
16af0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
16b00 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29  f(p[0])*(objc-1)
16b10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   );.    if( p==0
16b20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16b30 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ROR;.    for(i=0
16b40 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29  ; i<objc-1; i++)
16b50 7b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  {.      if( Tcl_
16b60 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16b70 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d 2c  terp, objv[1+i],
16b80 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20   &p[i]) ){.     
16b90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16ba0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
16bb0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
16bc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16bd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
16be0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
16bf0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
16c00 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73  NewWideIntObj((s
16c10 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29  qlite3_int64)p))
16c20 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
16c30 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  K;.}./*.** Usage
16c40 3a 20 20 20 69 6e 74 61 72 72 61 79 5f 61 64 64  :   intarray_add
16c50 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a  r  INT  ....**.*
16c60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
16c70 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67  ress of a C-lang
16c80 75 61 67 65 20 61 72 72 61 79 20 6f 66 20 33 32  uage array of 32
16c90 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 0a 2a  -bit integers..*
16ca0 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
16cb0 6c 64 20 74 68 65 20 61 72 72 61 79 20 69 73 20  ld the array is 
16cc0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
16cd0 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68  lloc().  Call th
16ce0 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63  is procedure onc
16cf0 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67  e.** with no arg
16d00 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20  uments in order 
16d10 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
16d20 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  y.  Each call to
16d30 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
16d40 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
16d50 65 20 70 72 65 76 69 6f 75 73 20 61 72 72 61 79  e previous array
16d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16d70 74 65 73 74 5f 69 6e 74 36 34 61 72 72 61 79 5f  test_int64array_
16d80 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  addr(.  void * c
16d90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16da0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16db0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16dc0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16dd0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
16de0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
16df0 33 5f 69 6e 74 36 34 20 2a 70 20 3d 20 30 3b 0a  3_int64 *p = 0;.
16e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16e10 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69  p);.  p = 0;.  i
16e20 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20  f( objc>1 ){.   
16e30 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
16e40 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d  loc( sizeof(p[0]
16e50 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20  )*(objc-1) );.  
16e60 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
16e70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16e80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62     for(i=0; i<ob
16e90 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  jc-1; i++){.    
16ea0 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b    Tcl_WideInt v;
16eb0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
16ec0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
16ed0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b  (interp, objv[1+
16ee0 69 5d 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  i], &v) ){.     
16ef0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16f00 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
16f10 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
16f20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16f30 20 20 20 7d 0a 20 20 20 20 20 20 70 5b 69 5d 20     }.      p[i] 
16f40 3d 20 76 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  = v;.    }.  }  
16f50 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
16f60 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
16f70 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73  NewWideIntObj((s
16f80 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29  qlite3_int64)p))
16f90 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
16fa0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  K;.}./*.** Usage
16fb0 3a 20 20 20 64 6f 75 62 6c 65 61 72 72 61 79 5f  :   doublearray_
16fc0 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a  addr  INT  ....*
16fd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16fe0 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c  address of a C-l
16ff0 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66  anguage array of
17000 20 64 6f 75 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20   doubles..**.** 
17010 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
17020 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
17030 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
17040 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72  ).  Call this pr
17050 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20  ocedure once.** 
17060 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
17070 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  s in order to re
17080 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45  lease memory.  E
17090 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
170a0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76   procedure.** ov
170b0 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
170c0 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  vious array..*/.
170d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
170e0 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72  doublearray_addr
170f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17100 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17110 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17120 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17130 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
17140 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
17150 74 61 74 69 63 20 64 6f 75 62 6c 65 20 2a 70 20  tatic double *p 
17160 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
17170 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20 30  free(p);.  p = 0
17180 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29  ;.  if( objc>1 )
17190 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
171a0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
171b0 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20  (p[0])*(objc-1) 
171c0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
171d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
171e0 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OR;.    for(i=0;
171f0 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b   i<objc-1; i++){
17200 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
17210 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
17220 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69  interp, objv[1+i
17230 5d 2c 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20  ], &p[i]) ){.   
17240 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17250 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  e(p);.        p 
17260 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
17270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17280 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17290 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52    .  Tcl_SetObjR
172a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
172b0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
172c0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
172d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
172e0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61  _OK;.}./*.** Usa
172f0 67 65 3a 20 20 20 74 65 78 74 61 72 72 61 79 5f  ge:   textarray_
17300 61 64 64 72 20 20 54 45 58 54 20 2e 2e 2e 0a 2a  addr  TEXT ....*
17310 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17320 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c  address of a C-l
17330 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66  anguage array of
17340 20 73 74 72 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20   strings..**.** 
17350 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
17360 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
17370 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
17380 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72  ).  Call this pr
17390 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20  ocedure once.** 
173a0 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
173b0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  s in order to re
173c0 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45  lease memory.  E
173d0 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
173e0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76   procedure.** ov
173f0 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
17400 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  vious array..*/.
17410 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17420 74 65 78 74 61 72 72 61 79 5f 61 64 64 72 28 0a  textarray_addr(.
17430 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17440 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17450 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17460 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17470 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17480 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  {.  int i;.  sta
17490 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
174a0 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 70   static char **p
174b0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
174c0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 73 71 6c 69  ; i<n; i++) sqli
174d0 74 65 33 5f 66 72 65 65 28 70 5b 69 5d 29 3b 0a  te3_free(p[i]);.
174e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
174f0 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69 66  );.  p = 0;.  if
17500 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20  ( objc>1 ){.    
17510 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
17520 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29  oc( sizeof(p[0])
17530 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20  *(objc-1) );.   
17540 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
17550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17560 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a    for(i=0; i<obj
17570 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  c-1; i++){.     
17580 20 70 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f   p[i] = sqlite3_
17590 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 54 63  mprintf("%s", Tc
175a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
175b0 5b 31 2b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  [1+i]));.    }. 
175c0 20 7d 0a 20 20 6e 20 3d 20 6f 62 6a 63 2d 31 3b   }.  n = objc-1;
175d0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
175e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
175f0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73  NewWideIntObj((s
17600 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29  qlite3_int64)p))
17610 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17620 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
17630 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
17640 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e  nd_int64  STMT N
17650 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
17660 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
17670 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61  nd_int64 interfa
17680 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
17690 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
176a0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
176b0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
176c0 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
176d0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
176e0 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
176f0 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
17700 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
17710 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
17720 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
17730 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76  _bind_int64(.  v
17740 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17750 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17760 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17770 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17780 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17790 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
177a0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
177b0 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76  .  Tcl_WideInt v
177c0 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
177d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
177e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
177f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17800 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
17810 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
17820 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17830 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
17840 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
17850 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
17860 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17870 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
17880 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17890 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
178a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
178b0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
178c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
178d0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
178e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
178f0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
17900 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17910 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
17920 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17930 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
17940 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17950 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
17960 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
17970 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
17980 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
17990 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
179a0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
179b0 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
179c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
179d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
179e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
179f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17a00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17a10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
17a20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
17a30 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56  double  STMT N V
17a40 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
17a50 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17a60 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63  _double interfac
17a70 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
17a80 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17a90 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
17aa0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
17ab0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
17ac0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
17ad0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
17ae0 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
17af0 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
17b00 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
17b10 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17b20 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76  bind_double(.  v
17b30 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17b40 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17b50 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17b60 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17b70 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17b80 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17b90 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
17ba0 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 20  .  double value 
17bb0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
17bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
17bd0 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  l;.  int i;.  st
17be0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
17bf0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
17c00 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
17c10 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70  * Name of the sp
17c20 65 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70  ecial floating p
17c30 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  oint value */.  
17c40 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
17c50 55 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65  Upper;   /* Uppe
17c60 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20  r 32 bits */.   
17c70 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c   unsigned int iL
17c80 6f 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72  ower;   /* Lower
17c90 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20   32 bits */.  } 
17ca0 61 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b  aSpecialFp[] = {
17cb0 0a 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20  .    {  "NaN",  
17cc0 20 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20      0x7fffffff, 
17cd0 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
17ce0 20 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20    {  "SNaN",    
17cf0 20 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66   0x7ff7ffff, 0xf
17d00 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
17d10 20 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78    "-NaN",     0x
17d20 66 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66  ffffffff, 0xffff
17d30 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
17d40 2d 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66  -SNaN",    0xfff
17d50 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  7ffff, 0xfffffff
17d60 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e  f },.    {  "+In
17d70 66 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30  f",     0x7ff000
17d80 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
17d90 2c 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c  ,.    {  "-Inf",
17da0 20 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c       0xfff00000,
17db0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
17dc0 20 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c     {  "Epsilon",
17dd0 20 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78    0x00000000, 0x
17de0 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20  00000001 },.    
17df0 7b 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30  {  "-Epsilon", 0
17e00 78 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30  x80000000, 0x000
17e10 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20  00001 },.    {  
17e20 22 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66  "NaN0",     0x7f
17e30 66 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f80000, 0x000000
17e40 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e  00 },.    {  "-N
17e50 61 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30  aN0",    0xfff80
17e60 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
17e70 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
17e80 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
17e90 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17ea0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
17eb0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
17ec0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
17ed0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
17ee0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
17ef0 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
17f00 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17f10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17f20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
17f30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17f40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17f50 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
17f60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17f70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
17f80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17f90 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
17fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17fb0 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65  R;..  /* Interce
17fc0 70 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e  pt the string "N
17fd0 61 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65  aN" and generate
17fe0 20 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72   a NaN value for
17ff0 20 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74   it..  ** All ot
18000 68 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20  her strings are 
18010 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
18020 6f 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46  o Tcl_GetDoubleF
18030 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54  romObj()..  ** T
18040 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
18050 4f 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64  Obj() should und
18060 65 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75  erstand "NaN" bu
18070 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a  t some versions.
18080 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62    ** contain a b
18090 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20  ug..  */.  zVal 
180a0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
180b0 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28  objv[3]);.  for(
180c0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
180d0 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66  pecialFp)/sizeof
180e0 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b  (aSpecialFp[0]);
180f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
18100 74 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70  trcmp(aSpecialFp
18110 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29  [i].zName, zVal)
18120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
18130 69 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20  ite3_uint64 x;. 
18140 20 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61       x = aSpecia
18150 6c 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20  lFp[i].iUpper;. 
18160 20 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20       x <<= 32;. 
18170 20 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69       x |= aSpeci
18180 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a  alFp[i].iLower;.
18190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
181a0 7a 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29  zeof(value)==8 )
181b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
181c0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a  sizeof(x)==8 );.
181d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61        memcpy(&va
181e0 6c 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20  lue, &x, 8);.   
181f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18200 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a    }.  if( i>=siz
18210 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f  eof(aSpecialFp)/
18220 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
18230 70 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20  p[0]) &&.       
18240 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
18250 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18260 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
18270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
18280 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
18290 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
182a0 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
182b0 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
182c0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
182d0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
182e0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
182f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18300 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
18310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18320 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18330 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
18340 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18350 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
18360 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54  e3_bind_null  ST
18370 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  MT N.**.** Test 
18380 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
18390 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  _null interface.
183a0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
183b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
183c0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
183d0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
183e0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
183f0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
18400 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
18410 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  s a NULL to the 
18420 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
18430 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
18440 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a  d_null(.  void *
18450 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18460 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18470 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18480 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18490 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
184a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
184b0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
184c0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
184d0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
184e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
184f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18500 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18510 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
18520 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
18530 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
18540 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20  TMT N", 0);.    
18550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18560 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
18570 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
18580 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18590 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
185a0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
185b0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
185c0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
185d0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
185e0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
185f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
18600 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
18610 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29  null(pStmt, idx)
18620 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
18630 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
18640 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
18650 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
18660 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
18670 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18680 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
18690 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
186a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
186b0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
186c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
186d0 78 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e  xt  STMT N STRIN
186e0 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  G BYTES.**.** Te
186f0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
18700 69 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61  ind_text interfa
18710 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
18720 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18730 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
18740 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
18750 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
18760 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
18770 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
18780 69 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72  inds a UTF-8 str
18790 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68  ing STRING to th
187a0 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
187b0 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53   string is BYTES
187c0 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a   bytes.** long..
187d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
187e0 73 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20  st_bind_text(.  
187f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18800 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18810 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18820 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18830 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18840 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18850 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
18860 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
18870 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
18880 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
18890 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
188a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
188b0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
188c0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
188d0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
188e0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
188f0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
18900 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59   STMT N VALUE BY
18910 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
18920 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18930 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
18940 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
18950 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18960 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
18970 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18980 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
18990 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
189a0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
189b0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
189c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
189d0 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65   = (char*)Tcl_Ge
189e0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
189f0 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  j(objv[3], &byte
18a00 73 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  s);.  if( Tcl_Ge
18a10 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18a20 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
18a30 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
18a40 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
18a50 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
18a60 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  xt(pStmt, idx, v
18a70 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c  alue, bytes, SQL
18a80 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
18a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
18aa0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
18ab0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
18ac0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
18ad0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
18ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18af0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18b00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
18b10 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
18b20 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18b40 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18b60 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
18b70 5f 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63  _text16 ?-static
18b80 3f 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20  ? STMT N STRING 
18b90 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
18ba0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
18bb0 64 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61  d_text16 interfa
18bc0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
18bd0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18be0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
18bf0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
18c00 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
18c10 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
18c20 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
18c30 69 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74  inds a UTF-16 st
18c40 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74  ring STRING to t
18c50 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
18c60 65 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45  e string is BYTE
18c70 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e  S bytes.** long.
18c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18c90 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  est_bind_text16(
18ca0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18cb0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18cc0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18cd0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18ce0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18cf0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
18d00 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
18d10 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18d20 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
18d30 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
18d40 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
18d50 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78   rc;..  void (*x
18d60 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f  Del)(void*) = (o
18d70 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54  bjc==6?SQLITE_ST
18d80 41 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e  ATIC:SQLITE_TRAN
18d90 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62  SIENT);.  Tcl_Ob
18da0 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62  j *oStmt    = ob
18db0 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63  jv[objc-4];.  Tc
18dc0 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20  l_Obj *oN       
18dd0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a  = objv[objc-3];.
18de0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69    Tcl_Obj *oStri
18df0 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ng  = objv[objc-
18e00 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  2];.  Tcl_Obj *o
18e10 42 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f  Bytes   = objv[o
18e20 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f  bjc-1];..  if( o
18e30 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
18e40 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  6){.    Tcl_Appe
18e50 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18e60 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18e70 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
18e80 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18e90 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
18ea0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
18eb0 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20  N VALUE BYTES", 
18ec0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
18ed0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18ee0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
18ef0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
18f00 47 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29  GetString(oStmt)
18f10 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18f20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18f30 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18f40 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e  omObj(interp, oN
18f50 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
18f60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
18f70 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c  lue = (char*)Tcl
18f80 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
18f90 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29  mObj(oString, 0)
18fa0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
18fb0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
18fc0 2c 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73  , oBytes, &bytes
18fd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18fe0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
18ff0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
19000 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76  6(pStmt, idx, (v
19010 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74  oid *)value, byt
19020 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28  es, xDel);.  if(
19030 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
19040 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
19050 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
19060 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19070 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
19080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19090 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
190a0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
190b0 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
190c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
190d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64  ERROR;.  }..#end
190e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
190f0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
19100 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19110 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
19120 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
19130 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
19140 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a   DATA BYTES.**.*
19150 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
19160 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74  e3_bind_blob int
19170 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
19180 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
19190 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
191a0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
191b0 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
191c0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
191d0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
191e0 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20  ** binds a BLOB 
191f0 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
19200 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59    The BLOB is BY
19210 54 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a  TES bytes in siz
19220 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19230 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28   test_bind_blob(
19240 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19250 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19260 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19270 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19280 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19290 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
192a0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
192b0 6c 65 6e 2c 20 69 64 78 3b 0a 20 20 69 6e 74 20  len, idx;.  int 
192c0 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
192d0 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
192e0 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75    sqlite3_destru
192f0 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74 72  ctor_type xDestr
19300 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 54  uctor = SQLITE_T
19310 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66 28  RANSIENT;..  if(
19320 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
19330 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=6 ){.    Tcl_A
19340 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19350 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19360 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19370 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
19380 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
19390 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
193a0 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 22  MT N DATA BYTES"
193b0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
193c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
193d0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29  .  if( objc==6 )
193e0 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63 74 6f  {.    xDestructo
193f0 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 49  r = SQLITE_STATI
19400 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20  C;.    objv++;. 
19410 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
19420 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
19430 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19440 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
19450 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19460 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
19470 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19480 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
19490 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
194a0 5f 45 52 52 4f 52 3b 0a 0a 20 20 76 61 6c 75 65  _ERROR;..  value
194b0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
194c0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
194d0 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  3], &len);.  if(
194e0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
194f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
19500 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
19510 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19520 0a 20 20 69 66 28 20 62 79 74 65 73 3e 6c 65 6e  .  if( bytes>len
19530 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
19540 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  f[200];.    sqli
19550 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
19560 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
19570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19580 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 75 73        "cannot us
19590 65 20 25 64 20 62 6c 6f 62 20 62 79 74 65 73 2c  e %d blob bytes,
195a0 20 68 61 76 65 20 25 64 22 2c 20 62 79 74 65 73   have %d", bytes
195b0 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  , len);.    Tcl_
195c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
195d0 65 72 70 2c 20 7a 42 75 66 2c 20 2d 31 29 3b 0a  erp, zBuf, -1);.
195e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
195f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RROR;.  }..  rc 
19600 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62  = sqlite3_bind_b
19610 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  lob(pStmt, idx, 
19620 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44  value, bytes, xD
19630 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66  estructor);.  if
19640 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
19650 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
19660 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
19670 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19680 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
19690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
196a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
196b0 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
196c0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
196d0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
196e0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
196f0 72 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a  r_count  STMT.**
19700 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19710 75 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72  umber of wildcar
19720 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  ds in the given 
19730 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
19740 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
19750 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
19760 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
19770 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19780 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19790 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
197a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
197b0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
197c0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
197d0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
197e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
197f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
19800 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
19810 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19820 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
19830 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
19840 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19850 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
19860 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
19870 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
19880 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
19890 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
198a0 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  j(sqlite3_bind_p
198b0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
198c0 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
198d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
198e0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
198f0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
19900 65 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e  er_name  STMT  N
19910 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
19920 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74  e name of the Nt
19930 68 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  h wildcard.  The
19940 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20   first wildcard 
19950 69 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74  is 1..** An empt
19960 79 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  y string is retu
19970 72 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74  rned if N is out
19980 20 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20   of range or if 
19990 74 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  the wildcard.** 
199a0 69 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a  is nameless..*/.
199b0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
199c0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
199d0 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ame(.  void * cl
199e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
199f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19a00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19a10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19a20 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19a30 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
19a40 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62  int i;..  if( ob
19a50 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
19a60 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
19a70 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
19a80 53 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65  STMT N");.    re
19a90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19aa0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
19ab0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
19ac0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19ad0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
19ae0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19af0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
19b00 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19b10 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
19b20 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19b30 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
19b40 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
19b50 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74   .     Tcl_NewSt
19b60 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
19b70 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
19b80 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29  ame(pStmt,i),-1)
19b90 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
19ba0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19bb0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
19bc0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
19bd0 69 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d  index  STMT  NAM
19be0 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
19bf0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
19c00 77 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20  wildcard called 
19c10 4e 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20  NAME.  Return 0 
19c20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
19c30 6f 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e  o such wildcard.
19c40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19c50 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
19c60 65 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64  er_index(.  void
19c70 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19c80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19c90 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19ca0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19cb0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19cc0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19cd0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
19ce0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
19cf0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
19d00 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
19d10 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74   NAME");.    ret
19d20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19d30 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
19d40 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19d50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19d60 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
19d70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19d80 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
19d90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
19da0 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
19db0 62 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74  bj(.       sqlit
19dc0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
19dd0 72 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63  r_index(pStmt,Tc
19de0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19df0 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29  [2])).     ).  )
19e00 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
19e10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
19e20 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65  e:   sqlite3_cle
19e30 61 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54  ar_bindings STMT
19e40 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
19e50 74 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e  t test_clear_bin
19e60 64 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20  dings(.  void * 
19e70 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19e80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19e90 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19ea0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19eb0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19ec0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
19ed0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
19ee0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
19ef0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
19f00 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
19f10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19f20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19f30 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
19f40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19f50 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19f60 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
19f70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
19f80 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
19f90 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
19fa0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65  tObj(sqlite3_cle
19fb0 61 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d  ar_bindings(pStm
19fc0 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
19fd0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19fe0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
19ff0 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f  _sleep MILLISECO
1a000 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NDS.*/.static in
1a010 74 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20  t test_sleep(.  
1a020 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a030 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a040 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1a050 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1a060 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1a070 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28    int ms;..  if(
1a080 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1a090 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1a0a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1a0b0 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  , "MILLISECONDS"
1a0c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a0d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1a0e0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1a0f0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1a100 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20  v[1], &ms) ){.  
1a110 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a120 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  OR;.  }.  Tcl_Se
1a130 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1a140 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1a150 28 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d  (sqlite3_sleep(m
1a160 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  s)));.  return T
1a170 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a180 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
1a190 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20  xtended_errcode 
1a1a0 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
1a1b0 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
1a1c0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1a1d0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1a1e0 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72  ite3_* API.** er
1a1f0 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22  ror code. e.g. "
1a200 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a  SQLITE_ERROR"..*
1a210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1a220 74 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20  t_ex_errcode(.  
1a230 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a240 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a250 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1a260 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1a270 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1a280 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a290 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1a2a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1a2b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a2c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a2d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a2e0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1a2f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a300 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
1a310 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a320 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1a330 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1a340 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1a350 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1a360 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a370 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1a380 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1a390 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63  rrcode(db);.  Tc
1a3a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a3b0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1a3c0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1a3d0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1a3e0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
1a3f0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72  sage: sqlite3_er
1a400 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
1a410 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
1a420 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1a430 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1a440 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
1a450 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
1a460 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
1a470 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
1a480 6e 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28  nt test_errcode(
1a490 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1a4a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1a4b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1a4c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1a4d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1a4e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1a4f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1a500 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1a510 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a520 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1a530 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1a540 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1a550 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1a560 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
1a570 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a580 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a590 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1a5a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1a5b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1a5c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1a5d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1a5e0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1a5f0 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  (db);.  Tcl_Appe
1a600 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a610 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1a620 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1a630 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a640 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1a650 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20   sqlite3_errmsg 
1a660 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
1a670 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65   the UTF-8 repre
1a680 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1a690 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
1a6a0 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
1a6b0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1a6c0 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
1a6d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a6e0 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f  est_errmsg(.  vo
1a6f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1a700 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1a710 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1a720 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1a730 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1a740 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1a750 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
1a760 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1a770 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1a780 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a790 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1a7a0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1a7b0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1a7c0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1a7d0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1a7e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a7f0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1a800 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1a810 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a820 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1a830 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1a840 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
1a850 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54  _errmsg(db);.  T
1a860 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1a870 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
1a880 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d  tringObj(zErr, -
1a890 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
1a8a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1a8b0 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72  sage:   test_err
1a8c0 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52  msg16 DB.**.** R
1a8d0 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31  eturns the UTF-1
1a8e0 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  6 representation
1a8f0 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
1a900 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
1a910 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
1a920 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
1a930 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20  I call. This is 
1a940 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a  a byte array obj
1a950 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a  ect at the TCL .
1a960 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74  ** level, and it
1a970 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78   includes the 0x
1a980 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  00 0x00 terminat
1a990 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20  or bytes at the 
1a9a0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54  end of the.** UT
1a9b0 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  F-16 string..*/.
1a9c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a9d0 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64  errmsg16(.  void
1a9e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1a9f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1aa00 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1aa10 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1aa20 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1aa30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aa40 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
1aa50 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
1aa60 64 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74  d *zErr;.  const
1aa70 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
1aa80 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66  bytes = 0;..  if
1aa90 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1aaa0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1aab0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1aac0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1aad0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1aae0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1aaf0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
1ab00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ab10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1ab20 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1ab30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1ab40 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1ab50 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1ab60 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72  L_ERROR;..  zErr
1ab70 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   = sqlite3_errms
1ab80 67 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a  g16(db);.  if( z
1ab90 45 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a  Err ){.    z = z
1aba0 45 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74  Err;.    for(byt
1abb0 65 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c  es=0; z[bytes] |
1abc0 7c 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79  | z[bytes+1]; by
1abd0 74 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20  tes+=2){}.  }.  
1abe0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1abf0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1ac00 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72  ByteArrayObj(zEr
1ac10 72 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64  r, bytes));.#end
1ac20 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1ac30 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1ac40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ac50 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1ac60 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73  te3_prepare DB s
1ac70 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1ac80 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  r?.**.** Compile
1ac90 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1aca0 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1acb0 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1acc0 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1acd0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1ace0 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1acf0 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1ad00 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1ad10 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1ad20 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1ad30 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1ad40 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1ad50 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1ad60 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1ad70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ad80 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a  t test_prepare(.
1ad90 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1ada0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1adb0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1adc0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1add0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ade0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1adf0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ae00 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
1ae10 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1ae20 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
1ae30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ae40 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
1ae50 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
1ae60 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1ae70 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
1ae80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ae90 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1aea0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1aeb0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1aec0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1aed0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1aee0 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1aef0 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
1af00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1af10 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1af20 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1af30 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1af40 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1af50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1af60 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
1af70 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
1af80 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1af90 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1afa0 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
1afb0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1afc0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
1afd0 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
1afe0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1aff0 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1b000 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63  zTail : 0);.  Tc
1b010 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
1b020 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c  terp);.  if( sql
1b030 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1b040 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1b050 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b060 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20  OR;.  if( zTail 
1b070 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  && objc>=5 ){.  
1b080 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
1b090 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
1b0a0 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54  bytes - (int)(zT
1b0b0 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ail-zSql);.    }
1b0c0 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 73 74  .    if( (int)st
1b0d0 72 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65  rlen(zTail)<byte
1b0e0 73 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  s ){.      bytes
1b0f0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
1b100 54 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Tail);.    }.   
1b110 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1b120 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1b130 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
1b140 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
1b150 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
1b160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b170 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b180 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
1b190 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1b1a0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
1b1b0 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
1b1c0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1b1d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1b1e0 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
1b1f0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
1b200 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b210 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
1b220 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1b230 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1b240 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1b250 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1b260 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b270 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1b280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1b290 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
1b2a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b2b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b2c0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1b2d0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
1b2e0 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f  ailvar?.**.** Co
1b2f0 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
1b300 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
1b310 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
1b320 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
1b330 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
1b340 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
1b350 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
1b360 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
1b370 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
1b380 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
1b390 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
1b3a0 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
1b3b0 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
1b3c0 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
1b3d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1b3e0 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
1b3f0 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  are_v2(.  void *
1b400 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b410 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b420 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b430 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b440 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1b450 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
1b460 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
1b470 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30 3b 20  har *zCopy = 0; 
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b490 2a 20 6d 61 6c 6c 6f 63 28 29 20 63 6f 70 79 20  * malloc() copy 
1b4a0 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e 74  of zSql */.  int
1b4b0 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20   bytes;.  const 
1b4c0 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  char *zTail = 0;
1b4d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1b4e0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1b4f0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
1b500 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
1b510 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
1b520 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b530 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b540 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b550 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1b560 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1b570 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1b580 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
1b590 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
1b5a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b5b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1b5c0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1b5d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b5e0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1b5f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b600 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1b610 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
1b620 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
1b630 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1b640 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
1b650 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
1b660 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e  _ERROR;..  /* In
1b670 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 7a  stead of using z
1b680 53 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d 61  Sql directly, ma
1b690 6b 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20 61  ke a copy into a
1b6a0 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64   buffer obtained
1b6b0 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 66  .  ** directly f
1b6c0 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68  rom malloc(). Th
1b6d0 65 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61 6b  e idea is to mak
1b6e0 65 20 69 74 20 65 61 73 69 65 72 20 66 6f 72 20  e it easier for 
1b6f0 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f  valgrind.  ** to
1b700 20 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76 65   spot buffer ove
1b710 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66  rreads.  */.  if
1b720 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
1b730 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63    zCopy = malloc
1b740 28 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d  (bytes);.    mem
1b750 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c  cpy(zCopy, zSql,
1b760 20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65   bytes);.  }else
1b770 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69  {.    int n = (i
1b780 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20  nt)strlen(zSql) 
1b790 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d  + 1;.    zCopy =
1b7a0 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20   malloc(n);.    
1b7b0 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53  memcpy(zCopy, zS
1b7c0 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 63  ql, n);.  }.  rc
1b7d0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1b7e0 72 65 5f 76 32 28 64 62 2c 20 7a 43 6f 70 79 2c  re_v2(db, zCopy,
1b7f0 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
1b800 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1b810 20 3a 20 30 29 3b 0a 20 20 66 72 65 65 28 7a 43   : 0);.  free(zC
1b820 6f 70 79 29 3b 0a 20 20 7a 54 61 69 6c 20 3d 20  opy);.  zTail = 
1b830 26 7a 53 71 6c 5b 28 7a 54 61 69 6c 20 2d 20 7a  &zSql[(zTail - z
1b840 43 6f 70 79 29 5d 3b 0a 0a 20 20 61 73 73 65 72  Copy)];..  asser
1b850 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
1b860 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20  || pStmt==0);.  
1b870 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1b880 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73  interp);.  if( s
1b890 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1b8a0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1b8b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b8c0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d  RROR;.  if( rc==
1b8d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 54 61  SQLITE_OK && zTa
1b8e0 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b  il && objc>=5 ){
1b8f0 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d  .    if( bytes>=
1b900 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  0 ){.      bytes
1b910 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29   = bytes - (int)
1b920 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20  (zTail-zSql);.  
1b930 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53    }.    Tcl_ObjS
1b940 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
1b950 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e  bjv[4], 0, Tcl_N
1b960 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69  ewStringObj(zTai
1b970 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20  l, bytes), 0);. 
1b980 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1b990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1b9a0 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
1b9b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
1b9c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
1b9d0 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29  uf), zBuf, "(%d)
1b9e0 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
1b9f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ba00 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
1ba10 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
1ba20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ba30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1ba40 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1ba50 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1ba60 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1ba70 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1ba80 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1ba90 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
1baa0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1bab0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1bac0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1bad0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1bae0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
1baf0 70 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42 0a  pare_tkt3134 DB.
1bb00 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  **.** Generate a
1bb10 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1bb20 65 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62  ent for a zero-b
1bb30 79 74 65 20 73 74 72 69 6e 67 20 61 73 20 61 20  yte string as a 
1bb40 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b  test.** for tick
1bb50 65 74 20 23 33 31 33 34 2e 20 20 54 68 65 20 73  et #3134.  The s
1bb60 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  tring should be 
1bb70 70 72 65 63 65 64 65 64 20 62 79 20 61 20 7a 65  preceded by a ze
1bb80 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  ro byte..*/.stat
1bb90 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
1bba0 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20 76  are_tkt3134(.  v
1bbb0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1bbc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1bbd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1bbe0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1bbf0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1bc00 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1bc10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1bc20 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30  r zSql[] = "\000
1bc30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71 6c  SELECT 1";.  sql
1bc40 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1bc50 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
1bc60 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
1bc70 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1bc80 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1bc90 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bca0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1bcb0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1bcc0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1bcd0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1bce0 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
1bcf0 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72  lvar", 0);.    r
1bd00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bd10 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1bd20 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1bd30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bd40 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1bd50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bd60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1bd70 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 26  prepare_v2(db, &
1bd80 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74  zSql[1], 0, &pSt
1bd90 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  mt, 0);.  assert
1bda0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
1bdb0 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69  | pStmt==0);.  i
1bdc0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1bdd0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
1bde0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
1bdf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1be00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1be10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1be20 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  mt==0 );.    sql
1be30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1be40 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
1be50 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
1be60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1be70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1be80 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
1be90 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
1bea0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1beb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1bec0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1bed0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1bee0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1bef0 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1bf00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bf10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1bf20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1bf30 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
1bf40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1bf50 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1bf60 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44 42  te3_prepare16 DB
1bf70 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
1bf80 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  ar.**.** Compile
1bf90 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1bfa0 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1bfb0 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1bfc0 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1bfd0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1bfe0 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1bff0 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1c000 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1c010 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1c020 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1c030 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1c040 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1c050 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1c060 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1c070 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c080 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36  t test_prepare16
1c090 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c0a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c0b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c0c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c0d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c0e0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1c0f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1c100 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1c110 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
1c120 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1c130 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
1c140 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
1c150 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c160 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1c170 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
1c180 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
1c190 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1c1a0 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1c1b0 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
1c1c0 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
1c1d0 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
1c1e0 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
1c1f0 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
1c200 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
1c210 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1c220 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1c230 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c240 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c250 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c260 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c270 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c280 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1c290 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
1c2a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c2b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1c2c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1c2d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1c2e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1c2f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1c300 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1c310 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1c320 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
1c330 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
1c340 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1c350 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1c360 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1c370 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1c380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1c390 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71  repare16(db, zSq
1c3a0 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
1c3b0 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
1c3c0 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73  il : 0);.  if( s
1c3d0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1c3e0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1c3f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1c400 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
1c410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1c420 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c430 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  f( objc>=5 ){.  
1c440 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
1c450 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62       objlen = ob
1c460 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38  jlen - (int)((u8
1c470 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
1c480 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
1c490 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1c4a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  0;.    }.    pTa
1c4b0 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  il = Tcl_NewByte
1c4c0 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a  ArrayObj((u8 *)z
1c4d0 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20  Tail, objlen);. 
1c4e0 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1c4f0 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20  unt(pTail);.    
1c500 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1c510 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1c520 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20  0, pTail, 0);.  
1c530 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1c540 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a  nt(pTail);.  }..
1c550 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1c560 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1c570 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1c580 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1c590 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1c5a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1c5b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c5c0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1c5d0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1c5e0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1c5f0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1c600 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c610 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
1c620 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62  re16_v2 DB sql b
1c630 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  ytes ?tailvar?.*
1c640 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
1c650 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
1c660 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
1c670 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
1c680 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
1c690 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
1c6a0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
1c6b0 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
1c6c0 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
1c6d0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
1c6e0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1c6f0 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
1c700 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
1c710 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
1c720 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
1c730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1c740 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  st_prepare16_v2(
1c750 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c760 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c770 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c780 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c790 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c7a0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1c7b0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1c7c0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1c7d0 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a  nst void *zSql;.
1c7e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54    const void *zT
1c7f0 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f  ail = 0;.  Tcl_O
1c800 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20  bj *pTail = 0;. 
1c810 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c820 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1c830 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e   zBuf[50]; .  in
1c840 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65  t rc;.  int byte
1c850 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1c860 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
1c870 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72   specified as ar
1c880 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  g 3 */.  int obj
1c890 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
1c8a0 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61     /* The byte-a
1c8b0 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61  rray length of a
1c8c0 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  rg 2 */..  if( o
1c8d0 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1c8e0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1c8f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c900 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1c910 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1c920 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1c930 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1c940 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  " DB sql bytes ?
1c950 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20  tailvar?", 0);. 
1c960 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c970 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1c980 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1c990 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c9a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1c9b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c9c0 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
1c9d0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1c9e0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
1c9f0 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  objlen);.  if( T
1ca00 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1ca10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
1ca20 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1ca30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1ca40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1ca50 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a  epare16_v2(db, z
1ca60 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
1ca70 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
1ca80 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28  Tail : 0);.  if(
1ca90 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1caa0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
1cab0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1cac0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1cad0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1cae0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1caf0 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a   if( objc>=5 ){.
1cb00 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b      if( zTail ){
1cb10 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1cb20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28  objlen - (int)((
1cb30 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
1cb40 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  )zSql);.    }els
1cb50 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  e{.      objlen 
1cb60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
1cb70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  Tail = Tcl_NewBy
1cb80 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a  teArrayObj((u8 *
1cb90 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b  )zTail, objlen);
1cba0 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1cbb0 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1cbc0 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1cbd0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1cbe0 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a  , 0, pTail, 0);.
1cbf0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1cc00 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d  ount(pTail);.  }
1cc10 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1cc20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1cc30 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1cc40 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1cc50 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1cc60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1cc70 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1cc80 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1cc90 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1cca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1ccb0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1ccc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1ccd0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1cce0 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69  n filename ?opti
1ccf0 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61  ons-list?.*/.sta
1cd00 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
1cd10 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1cd20 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1cd30 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1cd40 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1cd50 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1cd60 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
1cd70 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
1cd80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1cd90 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1cda0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
1cdb0 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
1cdc0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=1 ){.    Tcl_A
1cdd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1cde0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1cdf0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1ce00 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1ce10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1ce20 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
1ce30 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
1ce40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ce50 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
1ce60 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20  lename = objc>1 
1ce70 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  ? Tcl_GetString(
1ce80 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20  objv[1]) : 0;.  
1ce90 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
1cea0 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
1ceb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1cec0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1ced0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1cee0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1cef0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1cf00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1cf10 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
1cf20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1cf30 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1cf40 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c  ite3_open_v2 FIL
1cf50 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 0a  ENAME FLAGS VFS.
1cf60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1cf70 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f  st_open_v2(.  vo
1cf80 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1cf90 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1cfa0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1cfb0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1cfc0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1cfd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1cfe0 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  ename;.  const c
1cff0 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74  har *zVfs;.  int
1d000 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71   flags = 0;.  sq
1d010 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1d020 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
1d030 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46  [100];..  int nF
1d040 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  lag;.  Tcl_Obj *
1d050 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69  *apFlag;.  int i
1d060 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
1d070 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1d080 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1d090 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
1d0a0 41 4d 45 20 46 4c 41 47 53 20 56 46 53 22 29 3b  AME FLAGS VFS");
1d0b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d0c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69  ERROR;.  }.  zFi
1d0d0 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
1d0e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
1d0f0 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65  .  zVfs = Tcl_Ge
1d100 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
1d110 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d  ;.  if( zVfs[0]=
1d120 3d 30 78 30 30 20 29 20 7a 56 66 73 20 3d 20 30  =0x00 ) zVfs = 0
1d130 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69  ;..  rc = Tcl_Li
1d140 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
1d150 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1d160 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61  , &nFlag, &apFla
1d170 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  g);.  if( rc!=TC
1d180 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
1d190 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1d1a0 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Flag; i++){.    
1d1b0 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20 20 73  int iFlag;.    s
1d1c0 74 72 75 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b  truct OpenFlag {
1d1d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1d1e0 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20  r *zFlag;.      
1d1f0 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20  int flag;.    } 
1d200 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  aFlag[] = {.    
1d210 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1d220 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49  _READONLY", SQLI
1d230 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1d240 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d250 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1d260 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE", SQLITE_OPEN
1d270 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 0a 20 20  _READWRITE },.  
1d280 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d290 45 4e 5f 43 52 45 41 54 45 22 2c 20 53 51 4c 49  EN_CREATE", SQLI
1d2a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
1d2b0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1d2c0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1d2d0 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  LOSE", SQLITE_OP
1d2e0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1d2f0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d300 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1d310 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE", SQLITE_OPEN
1d320 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20  _EXCLUSIVE },.  
1d330 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d340 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20 53  EN_AUTOPROXY", S
1d350 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1d360 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ROXY },.      { 
1d370 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  "SQLITE_OPEN_MAI
1d380 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50  N_DB", SQLITE_OP
1d390 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20  EN_MAIN_DB },.  
1d3a0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d3b0 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c  EN_TEMP_DB", SQL
1d3c0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1d3d0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d3e0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1d3f0 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f  NT_DB", SQLITE_O
1d400 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
1d410 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d420 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1d430 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1d440 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1d450 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d460 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
1d470 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1d480 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1d490 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d4a0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1d4b0 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1d4c0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  N_SUBJOURNAL },.
1d4d0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1d4e0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1d4f0 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1d500 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1d510 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d520 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
1d530 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  ", SQLITE_OPEN_N
1d540 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20  OMUTEX },.      
1d550 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  { "SQLITE_OPEN_F
1d560 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49 54  ULLMUTEX", SQLIT
1d570 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1d580 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d590 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
1d5a0 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ACHE", SQLITE_OP
1d5b0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d  EN_SHAREDCACHE }
1d5c0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1d5d0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
1d5e0 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  CHE", SQLITE_OPE
1d5f0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
1d600 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1d610 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c  E_OPEN_WAL", SQL
1d620 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a  ITE_OPEN_WAL },.
1d630 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1d640 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54  OPEN_URI", SQLIT
1d650 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20  E_OPEN_URI },.  
1d660 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
1d670 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c   };.    rc = Tcl
1d680 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
1d690 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20 61  Struct(interp, a
1d6a0 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c  pFlag[i], aFlag,
1d6b0 20 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d   sizeof(aFlag[0]
1d6c0 29 2c 20 0a 20 20 20 20 20 20 20 20 22 66 6c 61  ), .        "fla
1d6d0 67 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20 20  g", 0, &iFlag.  
1d6e0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
1d6f0 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
1d700 20 72 63 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c   rc;.    flags |
1d710 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66  = aFlag[iFlag].f
1d720 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  lag;.  }..  rc =
1d730 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1d740 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c  (zFilename, &db,
1d750 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20   flags, zVfs);. 
1d760 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1d770 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1d780 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29  nterp, zBuf, db)
1d790 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d7a0 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ROR;.  Tcl_Appen
1d7b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1d7c0 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
1d7d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1d7e0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1d7f0 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61  e3_open16 filena
1d800 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74  me options.*/.st
1d810 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70  atic int test_op
1d820 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  en16(.  void * c
1d830 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d840 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d850 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d860 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d870 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1d880 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1d890 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  6.  const void *
1d8a0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
1d8b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
1d8c0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1d8d0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1d8e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d8f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1d900 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1d910 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
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 30 5d 29 2c 20 22 20 66 69 6c 65 6e  bjv[0]), " filen
1d940 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74  ame options-list
1d950 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1d960 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d970 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ..  zFilename = 
1d980 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1d990 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
1d9a0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f   0);.  sqlite3_o
1d9b0 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c  pen16(zFilename,
1d9c0 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20   &db);.  .  if( 
1d9d0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1d9e0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1d9f0 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65  , zBuf, db) ) re
1da00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1da10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1da20 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1da30 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1da40 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1da50 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1da60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1da70 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d  age: sqlite3_com
1da80 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20  plete16 <UTF-16 
1da90 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65  string>.**.** Re
1daa0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 73 75  turn 1 if the su
1dab0 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20  pplied argument 
1dac0 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
1dad0 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20  L statement, or 
1dae0 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
1daf0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1db00 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36   test_complete16
1db10 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1db20 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1db30 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1db40 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1db50 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1db60 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .){.#if !defined
1db70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d  (SQLITE_OMIT_COM
1db80 50 4c 45 54 45 29 20 26 26 20 21 64 65 66 69 6e  PLETE) && !defin
1db90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ed(SQLITE_OMIT_U
1dba0 54 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42  TF16).  char *zB
1dbb0 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  uf;..  if( objc!
1dbc0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1dbd0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1dbe0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74  p, 1, objv, "<ut
1dbf0 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20  f-16 sql>");.   
1dc00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1dc10 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d  R;.  }..  zBuf =
1dc20 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
1dc30 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1dc40 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54  objv[1], 0);.  T
1dc50 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1dc60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1dc70 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ntObj(sqlite3_co
1dc80 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29  mplete16(zBuf)))
1dc90 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1dca0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
1dcb0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   && SQLITE_OMIT_
1dcc0 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
1dcd0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1dce0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1dcf0 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a  3_step STMT.**.*
1dd00 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74  * Advance the st
1dd10 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e  atement to the n
1dd20 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ext row..*/.stat
1dd30 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70  ic int test_step
1dd40 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1dd50 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1dd60 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1dd70 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1dd80 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1dd90 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1dda0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1ddb0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1ddc0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1ddd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1dde0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1ddf0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1de00 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1de10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1de20 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
1de30 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1de40 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1de50 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1de60 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1de70 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1de80 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1de90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1dea0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1deb0 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28  Stmt);..  /* if(
1dec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
1ded0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52   && rc!=SQLITE_R
1dee0 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  OW ) return TCL_
1def0 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f  ERROR; */.  Tcl_
1df00 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1df10 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1df20 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
1df30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1df40 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
1df50 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a  st_sql(.  void *
1df60 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1df70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1df80 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1df90 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1dfa0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1dfb0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1dfc0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1dfd0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1dfe0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1dff0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
1e000 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1e010 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1e020 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1e030 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1e040 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1e050 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1e060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e070 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1e080 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
1e090 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
1e0a0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
1e0b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e0c0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
1e0d0 65 73 74 5f 65 78 5f 73 71 6c 28 0a 20 20 76 6f  est_ex_sql(.  vo
1e0e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e0f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e100 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1e110 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1e120 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1e130 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1e140 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  tmt;.  char *z;.
1e150 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1e160 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1e170 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1e180 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
1e190 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e1a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1e1b0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1e1c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1e1d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1e1e0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1e1f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1e200 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 61 6e   = sqlite3_expan
1e210 64 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  ded_sql(pStmt);.
1e220 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1e230 69 6e 74 65 72 70 2c 20 7a 2c 20 54 43 4c 5f 56  interp, z, TCL_V
1e240 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 73 71 6c 69  OLATILE);.  sqli
1e250 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
1e260 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e270 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1e280 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
1e290 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  nt STMT .**.** R
1e2a0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1e2b0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
1e2c0 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20  rned by the sql 
1e2d0 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a  statement STMT..
1e2e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1e2f0 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  st_column_count(
1e300 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1e310 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1e320 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1e330 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1e340 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1e350 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1e360 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
1e370 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1e380 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e390 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e3a0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e3b0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1e3c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1e3d0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1e3e0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1e3f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e400 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1e410 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1e420 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1e430 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1e440 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1e450 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1e460 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1e470 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1e480 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
1e490 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
1e4a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e4b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1e4c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e4d0 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
1e4e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1e4f0 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64 61  e type of the da
1e500 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
1e510 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
1e520 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  rent row..*/.sta
1e530 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1e540 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  umn_type(.  void
1e550 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1e560 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e570 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1e580 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e590 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1e5a0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e5b0 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1e5c0 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f  int tp;..  if( o
1e5d0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1e5e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e5f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1e600 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1e610 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1e620 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1e630 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1e640 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1e650 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e660 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1e670 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1e680 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1e690 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1e6a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e6b0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1e6c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1e6d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1e6e0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1e6f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20  _ERROR;..  tp = 
1e700 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1e710 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ype(pStmt, col);
1e720 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29 7b  .  switch( tp ){
1e730 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e740 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20  _INTEGER: .     
1e750 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1e760 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22  nterp, "INTEGER"
1e770 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1e780 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e790 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
1e7a0 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  L:.      Tcl_Set
1e7b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e7c0 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49  NULL", TCL_STATI
1e7d0 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
1e7e0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1e7f0 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54  E_FLOAT:.      T
1e800 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1e810 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43  erp, "FLOAT", TC
1e820 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1e830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1e840 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20  e SQLITE_TEXT:. 
1e850 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1e860 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54  lt(interp, "TEXT
1e870 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1e880 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e890 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
1e8a0 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  OB:.      Tcl_Se
1e8b0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1e8c0 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54  "BLOB", TCL_STAT
1e8d0 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1e8e0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1e8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
1e900 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
1e910 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e920 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1e930 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54  olumn_int64 STMT
1e940 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1e950 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
1e960 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1e970 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1e980 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a  row cast as an.*
1e990 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29 20  * wide (64-bit) 
1e9a0 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1e9b0 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
1e9c0 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  mn_int64(.  void
1e9d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1e9e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e9f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ea00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ea10 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1ea20 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ea30 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1ea40 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28  i64 iVal;..  if(
1ea50 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1ea60 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ea70 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1ea80 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1ea90 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1eaa0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1eab0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1eac0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1ead0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1eae0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1eaf0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1eb00 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1eb10 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1eb20 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1eb30 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1eb40 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1eb50 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1eb60 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1eb70 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61  CL_ERROR;..  iVa
1eb80 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1eb90 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
1eba0 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
1ebb0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1ebc0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
1ebd0 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(iVal));.  ret
1ebe0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ebf0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1ec00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  te3_column_blob 
1ec10 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1ec20 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1ec30 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f  olumn_blob(.  vo
1ec40 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1ec50 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ec60 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1ec70 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1ec80 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1ec90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1eca0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1ecb0 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f  .  int len;.  co
1ecc0 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b  nst void *pBlob;
1ecd0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1ece0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ecf0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ed00 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1ed10 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1ed20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1ed30 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1ed40 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1ed50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ed60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1ed70 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1ed80 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1ed90 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1eda0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1edb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1edc0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1edd0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1ede0 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1edf0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ee00 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65  ..  len = sqlite
1ee10 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1ee20 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42  Stmt, col);.  pB
1ee30 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
1ee40 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
1ee50 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1ee60 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1ee70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
1ee80 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e  ayObj(pBlob, len
1ee90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1eea0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1eeb0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1eec0 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20  umn_double STMT 
1eed0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
1eee0 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20  urn the data in 
1eef0 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
1ef00 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1ef10 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f 75  ow cast as a dou
1ef20 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1ef30 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64  nt test_column_d
1ef40 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
1ef50 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ef60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ef70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1ef80 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ef90 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1efa0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1efb0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75    int col;.  dou
1efc0 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28  ble rVal;..  if(
1efd0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1efe0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1eff0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1f000 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1f010 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1f020 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f030 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1f040 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1f050 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f060 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1f070 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1f080 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1f090 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1f0a0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1f0b0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1f0c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1f0d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1f0e0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1f0f0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61  CL_ERROR;..  rVa
1f100 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1f110 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
1f120 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1f130 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1f140 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  , Tcl_NewDoubleO
1f150 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(rVal));.  ret
1f160 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f170 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1f180 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53  te3_data_count S
1f190 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
1f1a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1f1b0 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
1f1c0 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
1f1d0 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
1f1e0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
1f1f0 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ata_count(.  voi
1f200 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1f210 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1f220 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1f230 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1f240 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1f250 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1f260 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1f270 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1f280 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f290 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1f2a0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1f2b0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1f2c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1f2d0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1f2e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1f2f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1f300 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1f310 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1f320 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1f330 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1f340 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f350 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1f360 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1f370 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1f380 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53  e3_data_count(pS
1f390 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
1f3a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1f3b0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1f3c0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
1f3d0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1f3e0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1f3f0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
1f400 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1f410 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1f420 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
1f430 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
1f440 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75   int test_stmt_u
1f450 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tf8(.  void * cl
1f460 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
1f470 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
1f480 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
1f490 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20  on to be invoke 
1f4a0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1f4b0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1f4c0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1f4d0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1f4e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1f4f0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1f500 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1f510 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
1f520 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20  _stmt*, int);.  
1f530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74  const char *zRet
1f540 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f  ;..  xFunc = (co
1f550 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73 71  nst char *(*)(sq
1f560 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1f570 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
1f580 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1f590 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1f5a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1f5b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1f5c0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1f5d0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1f5e0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1f5f0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1f600 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1f610 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1f620 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1f630 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1f640 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1f650 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1f660 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1f670 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1f680 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1f690 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1f6a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1f6b0 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d  Ret = xFunc(pStm
1f6c0 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  t, col);.  if( z
1f6d0 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ret ){.    Tcl_S
1f6e0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1f6f0 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30   (char *)zRet, 0
1f700 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f710 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
1f720 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61  c int test_globa
1f730 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69  l_recover(.  voi
1f740 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1f750 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1f760 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1f770 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1f780 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1f790 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f7a0 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 69 6e  _DEPRECATED.  in
1f7b0 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t rc;.  if( objc
1f7c0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
1f7d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1f7e0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
1f7f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f800 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
1f810 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61   = sqlite3_globa
1f820 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54  l_recover();.  T
1f830 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1f840 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1f850 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
1f860 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69  L_STATIC);.#endi
1f870 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1f880 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1f890 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1f8a0 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
1f8b0 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1f8c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1f8d0 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
1f8e0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1f8f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1f900 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
1f910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1f920 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
1f930 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f940 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ata,     /* Poin
1f950 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1f960 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1f970 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
1f980 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f990 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f9a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f9b0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1f9c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1f9d0 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
1f9e0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1f9f0 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  col;.  Tcl_Obj *
1fa00 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  pRet;.  const vo
1fa10 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63  id *zName16;.  c
1fa20 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75  onst void *(*xFu
1fa30 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
1fa40 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
1fa50 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20  c = (const void 
1fa60 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  *(*)(sqlite3_stm
1fa70 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44  t*, int))clientD
1fa80 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ata;.  if( objc!
1fa90 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1faa0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1fab0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1fac0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1fad0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1fae0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1faf0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1fb00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1fb10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1fb20 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1fb30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1fb40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1fb50 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1fb60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fb70 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1fb80 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1fb90 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1fba0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1fbb0 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d  OR;..  zName16 =
1fbc0 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
1fbd0 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31  l);.  if( zName1
1fbe0 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  6 ){.    int n;.
1fbf0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1fc00 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20 20  z = zName16;.   
1fc10 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c   for(n=0; z[n] |
1fc20 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b  | z[n+1]; n+=2){
1fc30 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c  }.    pRet = Tcl
1fc40 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1fc50 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a  (zName16, n+2);.
1fc60 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1fc70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
1fc80 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  t);.  }.#endif /
1fc90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1fca0 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  F16 */..  return
1fcb0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1fcc0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1fcd0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54  _column_int STMT
1fce0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
1fcf0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1fd00 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63  umn_bytes STMT c
1fd10 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1fd20 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1fd30 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20 63  n_bytes16 STMT c
1fd40 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  olumn.**.*/.stat
1fd50 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
1fd60 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _int(.  void * c
1fd70 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a  lientData,    /*
1fd80 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
1fd90 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
1fda0 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f  to be invoked */
1fdb0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1fdc0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1fdd0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1fde0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1fdf0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1fe00 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1fe10 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73    int (*xFunc)(s
1fe20 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1fe30 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
1fe40 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33 5f  int (*)(sqlite3_
1fe50 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
1fe60 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
1fe70 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1fe80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1fe90 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1fea0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1feb0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1fec0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1fed0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1fee0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1fef0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ff00 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1ff10 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1ff20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ff30 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1ff40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ff50 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1ff60 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1ff70 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1ff80 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1ff90 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1ffa0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1ffb0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1ffc0 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f  (xFunc(pStmt, co
1ffd0 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  l)));.  return T
1ffe0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1fff0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 73  Usage:  sqlite_s
20000 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d 41  et_magic  DB  MA
20010 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a  GIC-NUMBER.**.**
20020 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61 67   Set the db->mag
20030 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  ic value.  This 
20040 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
20050 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20 6c  error recovery l
20060 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ogic..*/.static 
20070 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  int sqlite_set_m
20080 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  agic(.  void * c
20090 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
200a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
200b0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
200c0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
200d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
200e0 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
200f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
20100 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
20110 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
20120 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
20130 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42 20  ,.         " DB 
20140 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20  MAGIC", 0);.    
20150 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
20160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
20170 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
20180 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
20190 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
201a0 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  R;.  if( strcmp(
201b0 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
201c0 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30  _MAGIC_OPEN")==0
201d0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
201e0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
201f0 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
20200 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
20210 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
20220 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a  _CLOSED")==0 ){.
20230 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
20240 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
20250 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
20260 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
20270 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42   "SQLITE_MAGIC_B
20280 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  USY")==0 ){.    
20290 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
202a0 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
202b0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
202c0 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
202d0 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29  TE_MAGIC_ERROR")
202e0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
202f0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
20300 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  GIC_ERROR;.  }el
20310 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  se if( Tcl_GetIn
20320 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
20330 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d 61  ], (int*)&db->ma
20340 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gic) ){.    retu
20350 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20360 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
20370 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
20380 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  e:  sqlite3_inte
20390 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a  rrupt  DB .**.**
203a0 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74 65   Trigger an inte
203b0 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73  rrupt on DB.*/.s
203c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69  tatic int test_i
203d0 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69 64  nterrupt(.  void
203e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
203f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
20400 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
20410 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
20420 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
20430 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
20440 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
20450 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
20460 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
20470 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
20480 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b  v[0], " DB", 0);
20490 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
204a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
204b0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
204c0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
204d0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
204e0 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
204f0 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b  3_interrupt(db);
20500 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
20510 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20 2a  ;.}..static u8 *
20520 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
20530 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a  seline = 0;../*.
20540 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61 63  ** Fill the stac
20550 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20 62  k with a known b
20560 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74  itpattern..*/.st
20570 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53 74  atic void prepSt
20580 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  ack(void){.  int
20590 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75 66   i;.  u32 bigBuf
205a0 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28 69  [65536];.  for(i
205b0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69 67  =0; i<sizeof(big
205c0 42 75 66 29 2f 73 69 7a 65 6f 66 28 62 69 67 42  Buf)/sizeof(bigB
205d0 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69 67  uf[0]); i++) big
205e0 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64 62  Buf[i] = 0xdeadb
205f0 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  eef;.  sqlite3_s
20600 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20  tack_baseline = 
20610 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35 35  (u8*)&bigBuf[655
20620 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  36];.}../*.** Ge
20630 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  t the current st
20640 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65 64  ack depth.  Used
20650 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
20660 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69  nly..*/.u64 sqli
20670 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76 6f  te3StackDepth(vo
20680 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20 72  id){.  u8 x;.  r
20690 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c 69  eturn (u64)(sqli
206a0 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
206b0 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a  ne - &x);.}../*.
206c0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
206d0 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44 42  e3_stack_used DB
206e0 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74   SQL.**.** Try t
206f0 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61 6d  o measure the am
20700 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73 70  ount of stack sp
20710 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63 61  ace used by a ca
20720 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
20730 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ec.*/.static int
20740 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64   test_stack_used
20750 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
20760 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
20770 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
20780 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
20790 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
207a0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69  te3 *db;.  int i
207b0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
207c0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
207d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
207e0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
207f0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
20800 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
20810 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20  " DB SQL", 0);. 
20820 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20830 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
20840 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
20850 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
20860 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20870 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61 63  RROR;.  prepStac
20880 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  k();.  (void)sql
20890 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72  ite3_exec(db, ar
208a0 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29 3b  gv[2], 0, 0, 0);
208b0 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b 20  .  for(i=65535; 
208c0 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29 73  i>=0 && ((u32*)s
208d0 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73  qlite3_stack_bas
208e0 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64 65  eline)[-i]==0xde
208f0 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20  adbeef; i--){}. 
20900 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
20910 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
20920 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a 20  wIntObj(i*4));. 
20930 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20940 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
20950 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75  sqlite_delete_fu
20960 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74 69  nction DB functi
20970 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65  on-name.**.** De
20980 6c 65 74 65 20 74 68 65 20 75 73 65 72 20 66 75  lete the user fu
20990 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e  nction 'function
209a0 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61  -name' from data
209b0 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e 20  base handle DB. 
209c0 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65 64  It.** is assumed
209d0 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 66   that the user f
209e0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65 61  unction was crea
209f0 74 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e 79  ted as UTF8, any
20a00 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72   number of.** ar
20a10 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61 79  guments (the way
20a20 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61   the TCL interfa
20a30 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a  ce does it)..*/.
20a40 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74  static int delet
20a50 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f  e_function(.  vo
20a60 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
20a70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
20a80 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
20a90 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
20aa0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
20ab0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
20ac0 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
20ad0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
20ae0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
20af0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
20b00 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
20b10 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20  , .        " DB 
20b20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20  function-name", 
20b30 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
20b40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20b50 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
20b60 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
20b70 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
20b80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
20b90 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
20ba0 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72  _function(db, ar
20bb0 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[2], -1, SQLIT
20bc0 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c  E_UTF8, 0, 0, 0,
20bd0 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65   0);.  Tcl_SetRe
20be0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
20bf0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
20c00 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
20c10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
20c20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
20c30 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74  ge: sqlite_delet
20c40 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20 63  e_collation DB c
20c50 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a  ollation-name.**
20c60 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63  .** Delete the c
20c70 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
20c80 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d  e 'collation-nam
20c90 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  e' from database
20ca0 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e 20   handle .** DB. 
20cb0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
20cc0 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  at the collation
20cd0 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63 72   sequence was cr
20ce0 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28 74  eated as UTF8 (t
20cf0 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20 54  he .** way the T
20d00 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  CL interface doe
20d10 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  s it)..*/.static
20d20 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c 6c   int delete_coll
20d30 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ation(.  void * 
20d40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20d50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20d60 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
20d70 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
20d80 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
20d90 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
20da0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
20db0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
20dc0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
20dd0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
20de0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
20df0 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74        " DB funct
20e00 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20  ion-name", 0);. 
20e10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20e20 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
20e30 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
20e40 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
20e50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20e60 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
20e70 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
20e80 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ation(db, argv[2
20e90 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ], SQLITE_UTF8, 
20ea0 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  0, 0);.  Tcl_Set
20eb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
20ec0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
20ed0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
20ee0 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
20ef0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
20f00 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67 65  sage: sqlite3_ge
20f10 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a  t_autocommit DB.
20f20 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
20f30 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
20f40 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74 6c  e DB is currentl
20f50 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  y in auto-commit
20f60 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e   mode..** Return
20f70 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
20f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
20f90 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76  _autocommit(.  v
20fa0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
20fb0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
20fc0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
20fd0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
20fe0 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66  v.){.  char zBuf
20ff0 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  [30];.  sqlite3 
21000 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
21010 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
21020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
21030 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
21040 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
21050 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
21060 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20     " DB", 0);.  
21070 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21080 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
21090 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
210a0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
210b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
210c0 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ROR;.  sqlite3_s
210d0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
210e0 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
210f0 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  , sqlite3_get_au
21100 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20  tocommit(db));. 
21110 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
21120 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
21130 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
21140 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
21150 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73  age: sqlite3_bus
21160 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a  y_timeout DB MS.
21170 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  **.** Set the bu
21180 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69  sy timeout.  Thi
21190 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79  s is more easily
211a0 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20   done using the 
211b0 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f  timeout.** metho
211c0 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74  d of the TCL int
211d0 65 72 66 61 63 65 2e 20 20 42 75 74 20 77 65 20  erface.  But we 
211e0 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20 74 65  need a way to te
211f0 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  st the case.** w
21200 68 65 72 65 20 69 74 20 72 65 74 75 72 6e 73 20  here it returns 
21210 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a  SQLITE_MISUSE..*
21220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
21230 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a  t_busy_timeout(.
21240 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
21250 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
21260 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
21270 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
21280 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
21290 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33 20  , ms;.  sqlite3 
212a0 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
212b0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
212c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
212d0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
212e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
212f0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
21300 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20     " DB", 0);.  
21310 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21320 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
21330 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
21340 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
21350 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21360 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
21370 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
21380 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65  gv[2], &ms) ) re
21390 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
213a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
213b0 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20  usy_timeout(db, 
213c0 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ms);.  Tcl_Appen
213d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
213e0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
213f0 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
21400 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
21410 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61  * Usage:  tcl_va
21420 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49  riable_type VARI
21430 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  ABLENAME.**.** R
21440 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
21450 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  f the internal r
21460 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f  epresentation fo
21470 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  r the.** value o
21480 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72 69  f the given vari
21490 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
214a0 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c 65  int tcl_variable
214b0 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
214c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
214d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
214e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
214f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
21500 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f  bjv[].){.  Tcl_O
21510 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20  bj *pVar;.  if( 
21520 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
21530 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
21540 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
21550 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20   "VARIABLE");.  
21560 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21570 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d  OR;.  }.  pVar =
21580 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
21590 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
215a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30  ring(objv[1]), 0
215b0 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f  , TCL_LEAVE_ERR_
215c0 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72  MSG);.  if( pVar
215d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
215e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56  _ERROR;.  if( pV
215f0 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20  ar->typePtr ){. 
21600 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
21610 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
21620 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61  NewStringObj(pVa
21630 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
21640 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65  , -1));.  }.  re
21650 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21660 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
21670 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
21680 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41  mory ?N?.**.** A
21690 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73  ttempt to releas
216a0 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  e memory current
216b0 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74 20  ly held but not 
216c0 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
216d0 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65  d..** The intege
216e0 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  r N is the numbe
216f0 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61 72  r of bytes we ar
21700 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c 65  e trying to rele
21710 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65  ase.  The .** re
21720 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
21730 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
21740 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c 65  ry actually rele
21750 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ased..*/.static 
21760 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73 65  int test_release
21770 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20  _memory(.  void 
21780 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
21790 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
217a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
217b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
217c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64   objv[].){.#if d
217d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
217e0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
217f0 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69  GEMENT) && !defi
21800 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21810 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b  DISKIO).  int N;
21820 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66  .  int amt;.  if
21830 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a  ( objc!=1 && obj
21840 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
21850 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
21860 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
21870 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
21880 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
21890 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
218a0 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
218b0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
218c0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20  p, objv[1], &N) 
218d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
218e0 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
218f0 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61   N = -1;.  }.  a
21900 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c  mt = sqlite3_rel
21910 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a  ease_memory(N);.
21920 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
21930 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
21940 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a  ewIntObj(amt));.
21950 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
21960 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
21970 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
21980 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
21990 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74  ory DB.**.** Att
219a0 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20  empt to release 
219b0 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79  memory currently
219c0 20 68 65 6c 64 20 62 79 20 64 61 74 61 62 61 73   held by databas
219d0 65 20 44 42 2e 20 20 52 65 74 75 72 6e 20 74 68  e DB.  Return th
219e0 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64 65  e.** result code
219f0 20 28 77 68 69 63 68 20 69 6e 20 74 68 65 20 63   (which in the c
21a00 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
21a10 61 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ation is always 
21a20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  zero)..*/.static
21a30 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 6c   int test_db_rel
21a40 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76  ease_memory(.  v
21a50 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
21a60 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
21a70 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
21a80 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
21a90 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
21aa0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
21ab0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62  int rc;.  if( ob
21ac0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
21ad0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
21ae0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
21af0 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
21b00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
21b10 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
21b20 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
21b30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
21b40 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
21b50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
21b60 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65   = sqlite3_db_re
21b70 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29  lease_memory(db)
21b80 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
21b90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
21ba0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
21bb0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
21bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
21bd0 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61  :  sqlite3_db_ca
21be0 63 68 65 66 6c 75 73 68 20 44 42 0a 2a 2a 0a 2a  cheflush DB.**.*
21bf0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6c 75  * Attempt to flu
21c00 73 68 20 61 6e 79 20 64 69 72 74 79 20 70 61 67  sh any dirty pag
21c10 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  es to disk..*/.s
21c20 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
21c30 62 5f 63 61 63 68 65 66 6c 75 73 68 28 0a 20 20  b_cacheflush(.  
21c40 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
21c50 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
21c60 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
21c70 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
21c80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
21c90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
21ca0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
21cb0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
21cc0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
21cd0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
21ce0 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
21cf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
21d00 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
21d10 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
21d20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
21d30 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
21d40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
21d50 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  c = sqlite3_db_c
21d60 61 63 68 65 66 6c 75 73 68 28 64 62 29 3b 0a 20  acheflush(db);. 
21d70 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54   if( rc ){.    T
21d80 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
21d90 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
21da0 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
21db0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
21dc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21dd0 52 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65  R;.  }..  Tcl_Re
21de0 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
21df0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
21e00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
21e10 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  ge:  sqlite3_sys
21e20 74 65 6d 5f 65 72 72 6e 6f 20 44 42 0a 2a 2a 0a  tem_errno DB.**.
21e30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 6f  ** Return the lo
21e40 77 2d 6c 65 76 65 6c 20 73 79 73 74 65 6d 20 65  w-level system e
21e50 72 72 6e 6f 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  rrno value..*/.s
21e60 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
21e70 79 73 74 65 6d 5f 65 72 72 6e 6f 28 0a 20 20 76  ystem_errno(.  v
21e80 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
21e90 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
21ea0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
21eb0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
21ec0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
21ed0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
21ee0 69 6e 74 20 69 45 72 72 6e 6f 3b 0a 20 20 69 66  int iErrno;.  if
21ef0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
21f00 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
21f10 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
21f20 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65  v, "DB");.    re
21f30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21f40 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
21f50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
21f60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
21f70 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
21f80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21f90 20 20 69 45 72 72 6e 6f 20 3d 20 73 71 6c 69 74    iErrno = sqlit
21fa0 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28  e3_system_errno(
21fb0 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
21fc0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
21fd0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 45  Tcl_NewIntObj(iE
21fe0 72 72 6e 6f 29 29 3b 0a 20 20 72 65 74 75 72 6e  rrno));.  return
21ff0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
22000 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
22010 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 20 44 42  3_db_filename DB
22020 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65   DBNAME.**.** Re
22030 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
22040 20 61 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74   a file associat
22050 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
22060 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
22070 74 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61  t test_db_filena
22080 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
22090 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
220a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
220b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
220c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
220d0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
220e0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
220f0 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66  r *zDbName;.  if
22100 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
22110 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
22120 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
22130 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b  v, "DB DBNAME");
22140 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22150 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
22160 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
22170 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
22180 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
22190 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
221a0 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65  ERROR;.  zDbName
221b0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
221c0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c  (objv[2]);.  Tcl
221d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
221e0 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 64 62  terp, sqlite3_db
221f0 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a 44  _filename(db, zD
22200 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29 30  bName), (void*)0
22210 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
22220 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
22230 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  ge:  sqlite3_db_
22240 72 65 61 64 6f 6e 6c 79 20 44 42 20 44 42 4e 41  readonly DB DBNA
22250 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
22260 31 20 6f 72 20 30 20 69 66 20 44 42 4e 41 4d 45  1 or 0 if DBNAME
22270 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f 72 20   is readonly or 
22280 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  not.  Return -1 
22290 69 66 20 44 42 4e 41 4d 45 20 64 6f 65 73 0a 2a  if DBNAME does.*
222a0 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  * not exist..*/.
222b0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
222c0 64 62 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76  db_readonly(.  v
222d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
222e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
222f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
22300 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
22310 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
22320 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
22330 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
22340 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ame;.  if( objc!
22350 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
22360 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
22370 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
22380 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  DBNAME");.    re
22390 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
223a0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
223b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
223c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
223d0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
223e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
223f0 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f    zDbName = Tcl_
22400 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
22410 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ]);.  Tcl_SetObj
22420 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
22430 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
22440 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
22450 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 29 29 3b  (db, zDbName)));
22460 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
22470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
22480 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  :  sqlite3_soft_
22490 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a  heap_limit ?N?.*
224a0 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65  *.** Query or se
224b0 74 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20  t the soft heap 
224c0 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75  limit for the cu
224d0 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54  rrent thread.  T
224e0 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f  he.** limit is o
224f0 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74  nly changed if t
22500 68 65 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e  he N is present.
22510 20 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c    The previous l
22520 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72  imit.** is retur
22530 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
22540 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61  nt test_soft_hea
22550 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20  p_limit(.  void 
22560 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
22570 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
22580 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
22590 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
225a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
225b0 69 74 65 33 5f 69 6e 74 36 34 20 61 6d 74 3b 0a  ite3_int64 amt;.
225c0 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 4e 20    Tcl_WideInt N 
225d0 3d 20 2d 31 3b 0a 20 20 69 66 28 20 6f 62 6a 63  = -1;.  if( objc
225e0 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29  !=1 && objc!=2 )
225f0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
22600 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
22610 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a  , objv, "?N?");.
22620 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22630 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
22640 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69  objc==2 ){.    i
22650 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
22660 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
22670 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20   objv[1], &N) ) 
22680 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22690 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71  ;.  }.  amt = sq
226a0 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
226b0 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 54 63  limit64(N);.  Tc
226c0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
226d0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
226e0 64 65 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a  deIntObj(amt));.
226f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
22710 20 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61     sqlite3_threa
22720 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20  d_cleanup.**.** 
22730 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
22740 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 20  _thread_cleanup 
22750 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  API..*/.static i
22760 6e 74 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63  nt test_thread_c
22770 6c 65 61 6e 75 70 28 0a 20 20 76 6f 69 64 20 2a  leanup(.  void *
22780 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
22790 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
227a0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
227b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
227c0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
227d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
227e0 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74  PRECATED.  sqlit
227f0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
22800 70 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  p();.#endif.  re
22810 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
22820 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
22830 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
22840 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a  counts  DB.**.**
22850 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f   Return a list o
22860 66 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  f numbers which 
22870 61 72 65 20 74 68 65 20 50 61 67 65 72 52 65 66  are the PagerRef
22880 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a  count for all.**
22890 20 70 61 67 65 72 73 20 6f 6e 20 65 61 63 68 20   pagers on each 
228a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
228b0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
228c0 6e 74 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65  nt test_pager_re
228d0 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f 69 64 20  fcounts(.  void 
228e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
228f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
22900 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
22910 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
22920 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
22930 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
22940 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a  i;.  int v, *a;.
22950 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
22960 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  lt;..  if( objc!
22970 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
22980 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
22990 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
229a0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
229b0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
229c0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
229d0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
229e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
229f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22a00 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
22a10 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
22a20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
22a30 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
22a40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52   TCL_ERROR;.  pR
22a50 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  esult = Tcl_NewO
22a60 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  bj();.  for(i=0;
22a70 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
22a80 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
22a90 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20  b[i].pBt==0 ){. 
22aa0 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20       v = -1;.   
22ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
22ac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22ad0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
22ae0 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 50      a = sqlite3P
22af0 61 67 65 72 53 74 61 74 73 28 73 71 6c 69 74 65  agerStats(sqlite
22b00 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
22b10 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20  aDb[i].pBt));.  
22b20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20      v = a[0];.  
22b30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
22b40 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
22b50 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  x);.    }.    Tc
22b60 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
22b70 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 73 75 6c  lement(0, pResul
22b80 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
22b90 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  (v));.  }.  Tcl_
22ba0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
22bb0 65 72 70 2c 20 70 52 65 73 75 6c 74 29 3b 0a 20  erp, pResult);. 
22bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
22bd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
22be0 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69  :   working_64bi
22bf0 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  t_int.**.** Some
22c00 20 54 43 4c 20 62 75 69 6c 64 73 20 28 65 78 3a   TCL builds (ex:
22c10 20 63 79 67 77 69 6e 29 20 64 6f 20 6e 6f 74 20   cygwin) do not 
22c20 73 75 70 70 6f 72 74 20 36 34 2d 62 69 74 20 69  support 64-bit i
22c30 6e 74 65 67 65 72 73 2e 20 20 54 68 69 73 0a 2a  ntegers.  This.*
22c40 2a 20 6c 65 61 64 73 20 74 6f 20 61 20 6e 75 6d  * leads to a num
22c50 62 65 72 20 6f 66 20 74 65 73 74 20 66 61 69 6c  ber of test fail
22c60 75 72 65 73 2e 20 20 54 68 65 20 70 72 65 73 65  ures.  The prese
22c70 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68 65 63 6b  nt command check
22c80 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20 62 75 69  s the.** TCL bui
22c90 6c 64 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  ld to see whethe
22ca0 72 20 6f 72 20 6e 6f 74 20 69 74 20 73 75 70 70  r or not it supp
22cb0 6f 72 74 73 20 36 34 2d 62 69 74 20 69 6e 74 65  orts 64-bit inte
22cc0 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20 72 65 74  gers.  It.** ret
22cd0 75 72 6e 73 20 54 52 55 45 20 69 66 20 69 74 20  urns TRUE if it 
22ce0 64 6f 65 73 20 61 6e 64 20 46 41 4c 53 45 20 69  does and FALSE i
22cf0 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  f not..**.** Thi
22d00 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
22d10 64 20 74 6f 20 77 61 72 6e 20 75 73 65 72 73 20  d to warn users 
22d20 74 68 61 74 20 74 68 65 69 72 20 54 43 4c 20 62  that their TCL b
22d30 75 69 6c 64 20 69 73 20 64 65 66 65 63 74 69 76  uild is defectiv
22d40 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68  e.** and that th
22d50 65 20 65 72 72 6f 72 73 20 74 68 65 79 20 61 72  e errors they ar
22d60 65 20 73 65 65 69 6e 67 20 69 6e 20 74 68 65 20  e seeing in the 
22d70 74 65 73 74 20 73 63 72 69 70 74 73 20 6d 69 67  test scripts mig
22d80 68 74 20 62 65 0a 2a 2a 20 61 20 72 65 73 75 6c  ht be.** a resul
22d90 74 20 6f 66 20 74 68 65 69 72 20 64 65 66 65 63  t of their defec
22da0 74 69 76 65 20 54 43 4c 20 72 61 74 68 65 72 20  tive TCL rather 
22db0 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e  than problems in
22dc0 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74   SQLite..*/.stat
22dd0 69 63 20 69 6e 74 20 77 6f 72 6b 69 6e 67 5f 36  ic int working_6
22de0 34 62 69 74 5f 69 6e 74 28 0a 20 20 43 6c 69 65  4bit_int(.  Clie
22df0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
22e00 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
22e10 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
22e20 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
22e30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22e40 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
22e50 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
22e60 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
22e70 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
22e80 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
22e90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22ea0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
22eb0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
22ec0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
22ed0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
22ee0 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
22ef0 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e 74 20 77  TestObj;.  int w
22f00 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 70  orking = 0;..  p
22f10 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  TestObj = Tcl_Ne
22f20 77 57 69 64 65 49 6e 74 4f 62 6a 28 31 30 30 30  wWideIntObj(1000
22f30 30 30 30 2a 28 69 36 34 29 31 32 33 34 35 36 37  000*(i64)1234567
22f40 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69 6e 67 20  890);.  working 
22f50 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74  = strcmp(Tcl_Get
22f60 53 74 72 69 6e 67 28 70 54 65 73 74 4f 62 6a 29  String(pTestObj)
22f70 2c 20 22 31 32 33 34 35 36 37 38 39 30 30 30 30  , "1234567890000
22f80 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f  000")==0;.  Tcl_
22f90 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 65  DecrRefCount(pTe
22fa0 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 53 65  stObj);.  Tcl_Se
22fb0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
22fc0 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
22fd0 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29 29 3b 0a  nObj(working));.
22fe0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22ff0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
23000 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f  d:   vfs_unlink_
23010 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  test.**.** This 
23020 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e 72 65  TCL command unre
23030 67 69 73 74 65 72 73 20 74 68 65 20 70 72 69 6d  gisters the prim
23040 61 72 79 20 56 46 53 20 61 6e 64 20 74 68 65 6e  ary VFS and then
23050 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69 74   registers.** it
23060 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20 54 68   back again.  Th
23070 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
23080 73 74 20 74 68 65 20 61 62 69 6c 69 74 79 20 74  st the ability t
23090 6f 20 72 65 67 69 73 74 65 72 20 61 0a 2a 2a 20  o register a.** 
230a0 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65 20 61 72  VFS when none ar
230b0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
230c0 69 73 74 65 72 65 64 2c 20 61 6e 64 20 74 68 65  istered, and the
230d0 20 61 62 69 6c 69 74 79 20 74 6f 20 0a 2a 2a 20   ability to .** 
230e0 75 6e 72 65 67 69 73 74 65 72 20 74 68 65 20 6f  unregister the o
230f0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 56 46  nly available VF
23100 53 2e 20 20 54 69 63 6b 65 74 20 23 32 37 33 38  S.  Ticket #2738
23110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
23120 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a  fs_unlink_test(.
23130 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
23140 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
23150 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
23160 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
23170 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
23180 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
23190 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
231a0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
231b0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
231c0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
231d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
231e0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
231f0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
23200 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
23210 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
23220 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
23230 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  i;.  sqlite3_vfs
23240 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71 6c 69 74   *pMain;.  sqlit
23250 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30  e3_vfs *apVfs[20
23260 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ];.  sqlite3_vfs
23270 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20 20 73 71   one, two;..  sq
23280 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
23290 73 74 65 72 28 30 29 3b 20 20 20 2f 2a 20 55 6e  ster(0);   /* Un
232a0 72 65 67 69 73 74 65 72 20 6f 66 20 4e 55 4c 4c  register of NULL
232b0 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a   is harmless */.
232c0 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f    one.zName = "_
232d0 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61  _one";.  two.zNa
232e0 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20  me = "__two";.. 
232f0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69   /* Calling sqli
23300 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
23310 20 77 69 74 68 20 32 6e 64 20 61 72 67 75 6d 65   with 2nd argume
23320 6e 74 20 6f 66 20 30 20 64 6f 65 73 20 6e 6f 74  nt of 0 does not
23330 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 74 68 65  .  ** change the
23340 20 64 65 66 61 75 6c 74 20 56 46 53 0a 20 20 2a   default VFS.  *
23350 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73 71 6c 69  /.  pMain = sqli
23360 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
23370 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
23380 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29  egister(&one, 0)
23390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 69  ;.  assert( pMai
233a0 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73  n==0 || pMain==s
233b0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
233c0 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0) );.  sqlite3_
233d0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 74 77  vfs_register(&tw
233e0 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
233f0 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61   pMain==0 || pMa
23400 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  in==sqlite3_vfs_
23410 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a  find(0) );..  /*
23420 20 57 65 20 63 61 6e 20 66 69 6e 64 20 61 20 56   We can find a V
23430 46 53 20 62 79 20 69 74 73 20 6e 61 6d 65 20 2a  FS by its name *
23440 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
23450 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
23460 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
23470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23480 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
23490 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a 20 20 2f  ")==&two );..  /
234a0 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  * Calling sqlite
234b0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69  _vfs_register wi
234c0 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f  th non-zero seco
234d0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 63 68 61  nd parameter cha
234e0 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a 20 64 65  nges the.  ** de
234f0 66 61 75 6c 74 20 56 46 53 2c 20 65 76 65 6e 20  fault VFS, even 
23500 69 66 20 74 68 65 20 31 73 74 20 70 61 72 61 6d  if the 1st param
23510 65 74 65 72 20 69 73 20 61 6e 20 65 78 69 73 74  eter is an exist
23520 69 67 20 56 46 53 20 74 68 61 74 20 69 73 0a 20  ig VFS that is. 
23530 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
23540 65 67 69 73 74 65 72 65 64 20 61 73 20 74 68 65  egistered as the
23550 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e 0a 20 20   non-default..  
23560 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
23570 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
23580 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
23590 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
235a0 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
235b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
235c0 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74  e3_vfs_find("__t
235d0 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  wo")==&two );.  
235e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
235f0 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 6f 6e  vfs_find(0)==&on
23600 65 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  e );.  sqlite3_v
23610 66 73 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f  fs_register(&two
23620 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 1);.  assert( 
23630 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
23640 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
23650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
23660 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
23670 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
23680 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23690 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26  3_vfs_find(0)==&
236a0 74 77 6f 20 29 3b 0a 20 20 69 66 28 20 70 4d 61  two );.  if( pMa
236b0 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
236c0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70  3_vfs_register(p
236d0 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 61 73  Main, 1);.    as
236e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
236f0 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
23700 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20 61 73 73  =&one );.    ass
23710 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
23720 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
23730 26 74 77 6f 20 29 3b 0a 20 20 20 20 61 73 73 65  &two );.    asse
23740 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
23750 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
23760 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e  ;.  }.  .  /* Un
23770 6c 69 6e 6b 20 74 68 65 20 64 65 66 61 75 6c 74  link the default
23780 20 56 46 53 2e 20 20 52 65 70 65 61 74 20 75 6e   VFS.  Repeat un
23790 74 69 6c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  til there are no
237a0 20 6d 6f 72 65 20 56 46 53 65 73 0a 20 20 2a 2a   more VFSes.  **
237b0 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 2a   registered..  *
237c0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  /.  for(i=0; i<s
237d0 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a  izeof(apVfs)/siz
237e0 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 3b 20 69  eof(apVfs[0]); i
237f0 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69  ++){.    apVfs[i
23800 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ] = sqlite3_vfs_
23810 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28  find(0);.    if(
23820 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20   apVfs[i] ){.   
23830 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
23840 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
23850 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e  _find(apVfs[i]->
23860 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 20 20  zName) );.      
23870 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
23880 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29  gister(apVfs[i])
23890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
238a0 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
238b0 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e  ind(apVfs[i]->zN
238c0 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ame) );.    }.  
238d0 7d 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  }.  assert( 0==s
238e0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
238f0 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 52 65  0) );.  .  /* Re
23900 67 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20  gister the main 
23910 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75  VFS as non-defau
23920 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d 61 64 65  lt (will be made
23930 20 64 65 66 61 75 6c 74 2c 20 73 69 6e 63 65 0a   default, since.
23940 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65 20 74 68    ** it'll be th
23950 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 20 65 78  e only one in ex
23960 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20  istence)..  */. 
23970 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
23980 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 30 29 3b  ister(pMain, 0);
23990 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
239a0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
239b0 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a  pMain );.  .  /*
239c0 20 55 6e 2d 72 65 67 69 73 74 65 72 20 74 68 65   Un-register the
239d0 20 6d 61 69 6e 20 56 46 53 20 61 67 61 69 6e 20   main VFS again 
239e0 74 6f 20 72 65 73 74 6f 72 65 20 61 6e 20 65 6d  to restore an em
239f0 70 74 79 20 56 46 53 20 6c 69 73 74 20 2a 2f 0a  pty VFS list */.
23a00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
23a10 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 29 3b  register(pMain);
23a20 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
23a30 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
23a40 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e  ) );..  /* Relin
23a50 6b 20 61 6c 6c 20 56 46 53 65 73 20 69 6e 20 72  k all VFSes in r
23a60 65 76 65 72 73 65 20 6f 72 64 65 72 2e 20 2a 2f  everse order. */
23a70 20 20 0a 20 20 66 6f 72 28 69 3d 73 69 7a 65 6f    .  for(i=sizeo
23a80 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28  f(apVfs)/sizeof(
23a90 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d  apVfs[0])-1; i>=
23aa0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
23ab0 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20   apVfs[i] ){.   
23ac0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
23ad0 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
23ae0 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
23af0 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71  rt( apVfs[i]==sq
23b00 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
23b10 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
23b20 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c  t( apVfs[i]==sql
23b30 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
23b40 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
23b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
23b60 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 75 74  * Unregister out
23b70 20 73 61 6d 70 6c 65 20 56 46 53 65 73 2e 20 2a   sample VFSes. *
23b80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
23b90 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29  unregister(&one)
23ba0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
23bb0 75 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29  unregister(&two)
23bc0 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74  ;..  /* Unregist
23bd0 65 72 69 6e 67 20 61 20 56 46 53 20 74 68 61 74  ering a VFS that
23be0 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
23bf0 79 20 72 65 67 69 73 74 65 72 65 64 20 69 73 20  y registered is 
23c00 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 73 71  harmless */.  sq
23c10 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
23c20 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71  ster(&one);.  sq
23c30 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
23c40 73 74 65 72 28 26 74 77 6f 29 3b 0a 20 20 61 73  ster(&two);.  as
23c50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
23c60 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
23c70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23c80 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
23c90 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20 29 3b 0a  ("__two")==0 );.
23ca0 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20  .  /* We should 
23cb0 62 65 20 6c 65 66 74 20 77 69 74 68 20 74 68 65  be left with the
23cc0 20 6f 72 69 67 69 6e 61 6c 20 64 65 66 61 75 6c   original defaul
23cd0 74 20 56 46 53 20 62 61 63 6b 20 61 73 20 74 68  t VFS back as th
23ce0 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
23cf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
23d00 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
23d10 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20 20 72 65  ==pMain );..  re
23d20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
23d30 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
23d40 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
23d50 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  t.**.** This TCL
23d60 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65 6d 70 74   command attempt
23d70 73 20 74 6f 20 76 66 73 5f 66 69 6e 64 20 61 6e  s to vfs_find an
23d80 64 20 76 66 73 5f 72 65 67 69 73 74 65 72 20 77  d vfs_register w
23d90 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  hen the.** sqlit
23da0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
23db0 69 6e 74 65 72 66 61 63 65 20 69 73 20 66 61 69  interface is fai
23dc0 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61 6c 6c 73  ling.  All calls
23dd0 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f   should fail..*/
23de0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
23df0 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 28 0a 20  initfail_test(. 
23e00 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
23e10 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
23e20 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
23e30 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
23e40 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
23e50 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
23e60 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
23e70 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
23e80 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
23e90 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
23ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23eb0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
23ec0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
23ed0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
23ee0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
23ef0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
23f00 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e  e3_vfs one;.  on
23f10 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65  e.zName = "__one
23f20 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ";..  if( sqlite
23f30 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20  3_vfs_find(0) ) 
23f40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23f50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
23f60 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 30  register(&one, 0
23f70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
23f80 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72  _vfs_find(0) ) r
23f90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23fa0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
23fb0 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29  egister(&one, 1)
23fc0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
23fd0 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65  vfs_find(0) ) re
23fe0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23ff0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
24000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64 20  .}../*.** Saved 
24010 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  VFSes.*/.static 
24020 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56  sqlite3_vfs *apV
24030 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69 63 20 69  fs[20];.static i
24040 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a  nt nVfs = 0;../*
24050 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
24060 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
24070 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69 73 74 65  .**.** Unregiste
24080 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a  r all VFSes..*/.
24090 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75  static int vfs_u
240a0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20  nregister_all(. 
240b0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
240c0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
240d0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
240e0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
240f0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
24100 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
24110 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
24120 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
24130 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
24140 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
24150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24160 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
24170 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
24180 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
24190 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
241a0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
241b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
241c0 72 72 61 79 53 69 7a 65 28 61 70 56 66 73 29 3b  rraySize(apVfs);
241d0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73   i++){.    apVfs
241e0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  [i] = sqlite3_vf
241f0 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69  s_find(0);.    i
24200 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29  f( apVfs[i]==0 )
24210 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
24220 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
24230 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
24240 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20  }.  nVfs = i;.  
24250 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
24260 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
24270 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
24280 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72  all.**.** Restor
24290 65 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61 74  e all VFSes that
242a0 20 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75 73   were removed us
242b0 69 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73 74  ing vfs_unregist
242c0 65 72 5f 61 6c 6c 2e 20 54 61 6b 69 6e 67 0a 2a  er_all. Taking.*
242d0 2a 20 63 61 72 65 20 74 6f 20 70 75 74 20 74 68  * care to put th
242e0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62 61  e linked list ba
242f0 63 6b 20 74 6f 67 65 74 68 65 72 20 69 6e 20 74  ck together in t
24300 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73  he same order as
24310 20 69 74 20 77 61 73 0a 2a 2a 20 69 6e 20 62 65   it was.** in be
24320 66 6f 72 65 20 76 66 73 5f 75 6e 72 65 67 69 73  fore vfs_unregis
24330 74 65 72 5f 61 6c 6c 20 77 61 73 20 69 6e 76 6f  ter_all was invo
24340 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
24350 6e 74 20 76 66 73 5f 72 65 72 65 67 69 73 74 65  nt vfs_reregiste
24360 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  r_all(.  ClientD
24370 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
24380 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
24390 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
243a0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
243b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
243c0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
243d0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
243e0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
243f0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
24400 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
24410 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24420 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
24430 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
24440 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
24450 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
24460 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
24470 69 3d 6e 56 66 73 2d 31 3b 20 69 3e 3d 30 3b 20  i=nVfs-1; i>=0; 
24480 69 2d 2d 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i--){.    sqlite
24490 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61  3_vfs_register(a
244a0 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d  pVfs[i], 1);.  }
244b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
244c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
244d0 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
244e0 6f 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a  ol_test DB.**.**
244f0 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
24500 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
24510 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
24520 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
24530 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
24540 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
24550 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
24560 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
24570 72 6f 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rol_test(.  Clie
24580 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
24590 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
245a0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
245b0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
245c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
245d0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
245e0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
245f0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
24600 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
24610 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
24620 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24630 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
24640 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
24650 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
24660 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
24670 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
24680 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
24690 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
246a0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
246b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
246c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
246d0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
246e0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
246f0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
24700 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
24710 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
24720 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24730 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
24740 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
24750 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
24760 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
24770 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
24780 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
24790 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
247a0 28 64 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67  (db, 0, 0, &iArg
247b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
247c0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
247d0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
247e0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
247f0 64 62 2c 20 22 6e 6f 74 61 64 61 74 61 62 61 73  db, "notadatabas
24800 65 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  e", SQLITE_FCNTL
24810 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 69 41 72  _LOCKSTATE, &iAr
24820 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
24830 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  ==SQLITE_ERROR )
24840 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24850 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
24860 2c 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69  , "main", -1, &i
24870 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Arg);.  assert( 
24880 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
24890 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  UND );.  rc = sq
248a0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
248b0 6f 6c 28 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d  ol(db, "temp", -
248c0 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73  1, &iArg);.  ass
248d0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
248e0 4e 4f 54 46 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d  NOTFOUND || rc==
248f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
24900 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
24910 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
24920 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
24930 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73  ol_lasterrno_tes
24940 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t DB.**.** This 
24950 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
24960 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
24970 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
24980 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
24990 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
249a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
249b0 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76  ITE_LAST_ERRNO v
249c0 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erb..*/.static i
249d0 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
249e0 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a  lasterrno_test(.
249f0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
24a00 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
24a10 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
24a20 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
24a30 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
24a40 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
24a50 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
24a60 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
24a70 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
24a80 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
24a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24aa0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
24ab0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
24ac0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
24ad0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
24ae0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
24af0 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  iArg = 0;.  sqli
24b00 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
24b10 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
24b20 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
24b30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24b40 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24b50 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
24b60 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
24b70 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
24b80 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c  v[0], 0), " DB",
24b90 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
24ba0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
24bb0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
24bc0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
24bd0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
24be0 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
24bf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24c00 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
24c10 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
24c20 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
24c30 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41  _LAST_ERRNO, &iA
24c40 72 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  rg);.  if( rc ){
24c50 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a   .    Tcl_SetObj
24c60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
24c70 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
24c80 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ); .    return T
24c90 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20  CL_ERROR; .  }. 
24ca0 20 69 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b   if( iArg!=0 ) {
24cb0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
24cc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55  esult(interp, "U
24cd0 6e 65 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65  nexpected non-ze
24ce0 72 6f 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20  ro errno: ",.   
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
24d10 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e  romObj(Tcl_NewIn
24d20 74 4f 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20  tObj(iArg), 0), 
24d30 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  " ", 0);.    ret
24d40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24d50 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
24d60 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
24d70 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
24d80 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
24d90 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53  test DB DBNAME S
24da0 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  IZE.**.** This T
24db0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
24dc0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
24dd0 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
24de0 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
24df0 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
24e00 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49  tion of the SQLI
24e10 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
24e20 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  FILE and.** SQLI
24e30 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
24e40 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73  FILE verbs..*/.s
24e50 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
24e60 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
24e70 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
24e80 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
24e90 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
24ea0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
24eb0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
24ec0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
24ed0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
24ee0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
24ef0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
24f00 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
24f10 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
24f20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24f30 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
24f40 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
24f50 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
24f60 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
24f70 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20  .  int nSize;   
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f90 20 20 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20     /* New chunk 
24fa0 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  size */.  char *
24fb0 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
24fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20            /* Db 
24fd0 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  name ("main", "t
24fe0 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20  emp" etc.) */.  
24ff0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25010 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
25020 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
25030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25040 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f          /* file_
25050 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e  control() return
25060 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
25070 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
25080 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
25090 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
250a0 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45   "DB DBNAME SIZE
250b0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
250c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
250d0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
250e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
250f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
25100 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c   &db) .   || Tcl
25110 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
25120 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
25130 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  &nSize).  ){.   
25140 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25150 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
25160 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
25170 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b  [2]);.  if( zDb[
25180 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d  0]=='\0' ) zDb =
25190 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73   NULL;..  rc = s
251a0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
251b0 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  rol(db, zDb, SQL
251c0 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
251d0 53 49 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e  SIZE, (void *)&n
251e0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
251f0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
25200 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
25210 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
25220 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
25230 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
25240 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25250 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
25270 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
25280 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44  _sizehint_test D
25290 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
252a0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
252b0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
252c0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
252d0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a  ol interface .**
252e0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e   with SQLITE_FCN
252f0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a  TL_SIZE_HINT.*/.
25300 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
25310 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
25320 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
25330 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
25340 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
25350 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
25360 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
25370 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
25380 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
25390 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
253a0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
253b0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
253c0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
253d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
253e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
253f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
25400 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
25410 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
25420 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e  .  Tcl_WideInt n
25430 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
25440 20 20 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a     /* Hinted siz
25450 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  e */.  char *zDb
25460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25470 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d         /* Db nam
25480 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
25490 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c  " etc.) */.  sql
254a0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
254c0 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
254d0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254f0 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e       /* file_con
25500 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f  trol() return co
25510 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  de */..  if( obj
25520 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
25530 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
25540 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
25550 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b  B DBNAME SIZE");
25560 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
25570 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
25580 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
25590 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
255a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
255b0 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65  b) .   || Tcl_Ge
255c0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
255d0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
255e0 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20   &nSize).  ){.  
255f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25600 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54  R;.  }.  zDb = T
25610 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
25620 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62  v[2]);.  if( zDb
25630 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20  [0]=='\0' ) zDb 
25640 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20  = NULL;..  rc = 
25650 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
25660 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51  trol(db, zDb, SQ
25670 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
25680 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e  HINT, (void *)&n
25690 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
256a0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
256b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
256c0 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
256d0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
256e0 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
256f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
25720 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
25730 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20  _lockproxy_test 
25740 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69  DB PWD.**.** Thi
25750 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
25760 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
25770 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
25780 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
25790 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
257a0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  eration of the S
257b0 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
257c0 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53  OXYFILE and.** S
257d0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
257e0 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a  OXYFILE verbs..*
257f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
25800 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
25810 6f 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  oxy_test(.  Clie
25820 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
25830 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
25840 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
25850 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
25860 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
25870 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
25880 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
25890 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
258a0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
258b0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
258c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
258d0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
258e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
258f0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
25900 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
25910 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
25920 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  b;.  .  if( objc
25930 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
25940 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
25950 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
25960 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
25970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25980 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
25990 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
259a0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57  [0], 0), " DB PW
259b0 44 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  D", 0);.    retu
259c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
259d0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
259e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
259f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
25a00 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
25a10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25a20 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65  ;.  }.  .#if !de
25a30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
25a40 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
25a50 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  E).#  if defined
25a60 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20  (__APPLE__).#   
25a70 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
25a80 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
25a90 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20  YLE 1.#  else.# 
25aa0 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
25ab0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
25ac0 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66  STYLE 0.#  endif
25ad0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
25ae0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25af0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
25b00 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
25b10 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73 74  {.    char *test
25b20 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63  Path;.    int rc
25b30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a  ;.    int nPwd;.
25b40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
25b50 7a 50 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70  zPwd;.    char p
25b60 72 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20  roxyPath[400];. 
25b70 20 20 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54     .    zPwd = T
25b80 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
25b90 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50  Obj(objv[2], &nP
25ba0 77 64 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a  wd);.    if( siz
25bb0 65 6f 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e  eof(proxyPath)<n
25bc0 50 77 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20  Pwd+20 ){.      
25bd0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
25be0 28 69 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f  (interp, "PWD to
25bf0 6f 20 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30  o big", (void*)0
25c00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25c10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
25c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
25c30 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 72 6f  rintf(sizeof(pro
25c40 78 79 50 61 74 68 29 2c 20 70 72 6f 78 79 50 61  xyPath), proxyPa
25c50 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f  th, "%s/test.pro
25c60 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20  xy", zPwd);.    
25c70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
25c80 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
25c90 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
25ca0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
25cb0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
25cc0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
25cd0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
25ce0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
25cf0 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
25d00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
25d10 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
25d20 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
25d30 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
25d40 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
25d50 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73  KPROXYFILE, &tes
25d60 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  tPath);.    if( 
25d70 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74  strncmp(proxyPat
25d80 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20 29  h,testPath,11) )
25d90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
25da0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
25db0 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c   "Lock proxy fil
25dc0 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20  e did not match 
25dd0 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  the ".          
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25df0 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79       "previously
25e00 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22   assigned value"
25e10 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
25e20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25e30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
25e40 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
25e50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
25e60 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
25e70 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  c));.      retur
25e80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
25e90 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
25ea0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
25eb0 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
25ec0 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
25ed0 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ILE, proxyPath);
25ee0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
25ef0 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
25f00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
25f10 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
25f20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
25f30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
25f40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
25f50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
25f60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
25f70 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  IN./*.** tclcmd:
25f80 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
25f90 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
25fa0 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
25fb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
25fc0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
25fd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
25fe0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
25ff0 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
26000 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
26010 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
26020 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
26030 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
26040 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69  _av_retry(.  Cli
26050 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
26060 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
26070 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
26080 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
26090 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
260a0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
260b0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
260c0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
260d0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
260e0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
260f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26100 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
26110 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
26120 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
26130 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
26140 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26150 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
26160 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72  int a[2];.  char
26170 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
26180 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
26190 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
261a0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
261b0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
261c0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
261d0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
261e0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
261f0 22 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41  " DB NRETRY DELA
26200 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  Y", 0);.    retu
26210 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26220 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
26230 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
26240 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
26250 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
26260 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26270 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
26280 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
26290 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
262a0 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20  &a[0]) ) return 
262b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
262c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
262d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
262e0 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74  3], &a[1]) ) ret
262f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
26310 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
26320 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
26330 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
26340 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73  , (void*)a);.  s
26350 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
26360 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
26370 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b  d %d %d", rc, a[
26380 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c  0], a[1]);.  Tcl
26390 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
263a0 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
263b0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
263c0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
263d0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
263e0 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74  ontrol_win32_set
263f0 5f 68 61 6e 64 6c 65 20 44 42 20 48 41 4e 44 4c  _handle DB HANDL
26400 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
26410 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
26420 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
26430 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
26440 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
26450 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
26460 53 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63 6f 64  SET_HANDLE opcod
26470 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26480 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
26490 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a  n32_set_handle(.
264a0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
264b0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
264c0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
264d0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
264e0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
264f0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
26500 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
26510 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
26520 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
26530 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
26540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26550 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26560 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26570 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26580 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26590 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
265a0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
265b0 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c  c;.  HANDLE hFil
265c0 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72  e = NULL;.  char
265d0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
265e0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
265f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
26600 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
26610 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
26620 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
26630 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
26640 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
26650 22 20 44 42 20 48 41 4e 44 4c 45 22 2c 20 30 29  " DB HANDLE", 0)
26660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
26670 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
26680 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
26690 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
266a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
266b0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
266c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
266d0 0a 20 20 69 66 28 20 67 65 74 57 69 6e 33 32 48  .  if( getWin32H
266e0 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20 54 63  andle(interp, Tc
266f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
26700 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29 20 29 7b  [2]), &hFile) ){
26710 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
26720 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
26730 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
26740 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
26750 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
26760 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a  N32_SET_HANDLE,.
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26780 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
26790 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71  d*)&hFile);.  sq
267a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
267b0 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
267c0 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a   %p", rc, (void*
267d0 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41  )hFile);.  Tcl_A
267e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
267f0 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
26800 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
26810 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  K;  .}.#endif../
26820 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
26830 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
26840 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49  ist_wal DB PERSI
26850 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68  ST-FLAG.**.** Th
26860 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
26870 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
26880 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
26890 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
268a0 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
268b0 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f  PERSIST_WAL opco
268c0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
268d0 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  t file_control_p
268e0 65 72 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c  ersist_wal(.  Cl
268f0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
26900 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
26910 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
26920 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
26930 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
26940 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
26950 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
26960 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
26970 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
26980 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
26990 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
269a0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
269b0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
269c0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
269d0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
269e0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
269f0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
26a00 20 69 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20   int bPersist;. 
26a10 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20   char z[100];.. 
26a20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
26a30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
26a40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
26a50 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
26a60 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
26a70 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
26a80 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
26a90 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c   0), " DB FLAG",
26aa0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
26ab0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
26ac0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
26ad0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
26ae0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
26af0 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
26b00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26b10 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
26b20 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
26b30 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50  rp, objv[2], &bP
26b40 65 72 73 69 73 74 29 20 29 20 72 65 74 75 72 6e  ersist) ) return
26b50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
26b60 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
26b70 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
26b80 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
26b90 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69  ERSIST_WAL, (voi
26ba0 64 2a 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20  d*)&bPersist);. 
26bb0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
26bc0 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
26bd0 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65  "%d %d", rc, bPe
26be0 72 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70  rsist);.  Tcl_Ap
26bf0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
26c00 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b  p, z, (char*)0);
26c10 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
26c20 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
26c30 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
26c40 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
26c50 65 72 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d  erwrite DB PSOW-
26c60 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  FLAG.**.** This 
26c70 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
26c80 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
26c90 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
26ca0 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ace with.** the 
26cb0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
26cc0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
26cd0 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
26ce0 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
26cf0 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
26d00 65 72 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e  erwrite(.  Clien
26d10 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
26d20 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
26d30 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
26d40 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
26d50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
26d60 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
26d70 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
26d80 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
26d90 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
26da0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
26db0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26dc0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
26dd0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
26de0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
26df0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26e00 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
26e10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
26e20 74 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30  t b;.  char z[10
26e30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
26e40 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
26e50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
26e60 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
26e70 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
26e80 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
26e90 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
26ea0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
26eb0 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72  FLAG", 0);.    r
26ec0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26ed0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
26ee0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
26ef0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
26f00 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
26f10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
26f20 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
26f30 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
26f40 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
26f50 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
26f60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
26f70 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
26f80 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53  ontrol(db,NULL,S
26f90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
26fa0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
26fb0 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73 71  (void*)&b);.  sq
26fc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
26fd0 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
26fe0 20 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20   %d", rc, b);.  
26ff0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
27000 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61  (interp, z, (cha
27010 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
27020 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a  TCL_OK;  .}.../*
27030 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
27040 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
27050 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a  me DB ?AUXDB?.**
27060 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
27070 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
27080 65 73 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20  es the stack of 
27090 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
270a0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
270b0 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69  l_vfsname(.  Cli
270c0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
270d0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
270e0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
270f0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
27100 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27110 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
27120 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
27130 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
27140 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
27150 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
27160 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27170 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
27180 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
27190 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
271a0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
271b0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
271c0 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
271d0 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69   *zDbName = "mai
271e0 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56 66 73  n";.  char *zVfs
271f0 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Name = 0;..  if(
27200 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
27210 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
27220 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
27230 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
27240 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
27250 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
27260 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
27270 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
27280 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20   ?AUXDB?", 0);. 
27290 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
272a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
272b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
272c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
272d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
272e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
272f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27300 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
27310 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c     zDbName = Tcl
27320 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27330 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  2]);.  }.  sqlit
27340 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
27350 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c  db, zDbName, SQL
27360 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
27370 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61  E,(void*)&zVfsNa
27380 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  me);.  Tcl_Appen
27390 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
273a0 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a  zVfsName, (char*
273b0 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  )0);.  sqlite3_f
273c0 72 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  ree(zVfsName);. 
273d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
273e0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
273f0 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
27400 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 20 44  l_tempfilename D
27410 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20  B ?AUXDB?.**.** 
27420 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
27430 74 68 61 74 20 69 73 20 61 20 74 65 6d 70 6f 72  that is a tempor
27440 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a  ary filename.*/.
27450 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
27460 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65  control_tempfile
27470 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
27480 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27490 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
274a0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
274b0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
274c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
274d0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
274e0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
274f0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27500 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
27510 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
27520 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27530 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27540 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27550 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27560 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27570 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
27580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
27590 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
275a0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
275b0 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
275c0 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
275d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
275e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
275f0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
27600 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
27610 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
27620 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
27630 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42   0), " DB ?AUXDB
27640 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
27650 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27660 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
27670 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
27680 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27690 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
276a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
276b0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
276c0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e  c==3 ){.    zDbN
276d0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
276e0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
276f0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  }.  sqlite3_file
27700 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
27710 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
27720 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c  TL_TEMPFILENAME,
27730 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d 65 29   (void*)&zTName)
27740 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
27750 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 54 4e  sult(interp, zTN
27760 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
27770 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27780 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  TName);.  return
27790 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f   TCL_OK;  .}.../
277a0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
277b0 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a  qlite3_vfs_list.
277c0 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61  **.**   Return a
277d0 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69   tcl list contai
277e0 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ning the names o
277f0 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64  f all registered
27800 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69   vfs's..*/.stati
27810 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a  c int vfs_list(.
27820 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
27830 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
27840 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
27850 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
27860 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
27870 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
27880 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
27890 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
278a0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
278b0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
278c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
278d0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
278e0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
278f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
27900 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
27910 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
27920 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
27930 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
27940 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
27950 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
27960 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
27970 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
27980 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72  objv, "");.    r
27990 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
279a0 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d  .  }.  for(pVfs=
279b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
279c0 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d  (0); pVfs; pVfs=
279d0 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pVfs->pNext){.  
279e0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
279f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
27a00 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
27a10 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e  StringObj(pVfs->
27a20 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d  zName, -1));.  }
27a30 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
27a40 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
27a50 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
27a60 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
27a70 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
27a80 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c  _limit DB ID VAL
27a90 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  UE.**.** This TC
27aa0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
27ab0 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  he sqlite3_limit
27ac0 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
27ad0 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
27ae0 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
27af0 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61  the same..*/.sta
27b00 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d  tic int test_lim
27b10 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  it(.  ClientData
27b20 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
27b30 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
27b40 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
27b50 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
27b60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
27b70 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
27b80 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
27b90 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
27ba0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
27bb0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
27bc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
27bd0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27be0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27bf0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27c00 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
27c10 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
27c20 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63 20  nt rc;.  static 
27c30 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
27c40 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
27c50 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20  .     int id;.  
27c60 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  } aId[] = {.    
27c70 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
27c80 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
27c90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
27ca0 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  IT_LENGTH       
27cb0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
27cc0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53   "SQLITE_LIMIT_S
27cd0 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20  QL_LENGTH",     
27ce0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
27cf0 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20  T_SQL_LENGTH    
27d00 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
27d10 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  "SQLITE_LIMIT_CO
27d20 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20 20  LUMN",          
27d30 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
27d40 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20  _COLUMN         
27d50 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
27d60 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
27d70 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
27d80 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
27d90 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20  EXPR_DEPTH      
27da0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
27db0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
27dc0 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20 20  OUND_SELECT",   
27dd0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
27de0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20  OMPOUND_SELECT  
27df0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
27e00 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
27e10 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OP",            
27e20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44   SQLITE_LIMIT_VD
27e30 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20  BE_OP           
27e40 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
27e50 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
27e60 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20 20  ON_ARG",        
27e70 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
27e80 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20  CTION_ARG       
27e90 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
27ea0 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
27eb0 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  D",            S
27ec0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
27ed0 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20  CHED            
27ee0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
27ef0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
27f00 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51  TERN_LENGTH", SQ
27f10 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
27f20 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20  PATTERN_LENGTH  
27f30 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
27f40 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
27f50 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51 4c  NUMBER",     SQL
27f60 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
27f70 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 7d  LE_NUMBER      }
27f80 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
27f90 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
27fa0 50 54 48 22 2c 20 20 20 20 20 20 20 53 51 4c 49  PTH",       SQLI
27fb0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
27fc0 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 7d 2c  _DEPTH        },
27fd0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
27fe0 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
27ff0 41 44 53 22 2c 20 20 20 20 20 20 53 51 4c 49 54  ADS",      SQLIT
28000 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
28010 48 52 45 41 44 53 20 20 20 20 20 20 20 7d 2c 0a  HREADS       },.
28020 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20      .    /* Out 
28030 6f 66 20 72 61 6e 67 65 20 74 65 73 74 20 63 61  of range test ca
28040 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51  ses */.    { "SQ
28050 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d  LITE_LIMIT_TOOSM
28060 41 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20  ALL",           
28070 20 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   -1,            
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
280a0 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47  ITE_LIMIT_TOOBIG
280b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
280c0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
280d0 4b 45 52 5f 54 48 52 45 41 44 53 2b 31 20 20 20  KER_THREADS+1   
280e0 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
280f0 69 2c 20 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74  i, id = 0;.  int
28100 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68   val;.  const ch
28110 61 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20  ar *zId;..  if( 
28120 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
28130 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
28140 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
28150 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
28160 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
28170 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
28180 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
28190 22 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c 20  " DB ID VALUE", 
281a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
281b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
281c0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
281d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
281e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
281f0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
28200 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20  CL_ERROR;.  zId 
28210 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
28220 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28  objv[2]);.  for(
28230 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49  i=0; i<sizeof(aI
28240 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d  d)/sizeof(aId[0]
28250 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
28260 20 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49 64   strcmp(zId, aId
28270 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
28280 0a 20 20 20 20 20 20 69 64 20 3d 20 61 49 64 5b  .      id = aId[
28290 69 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72 65  i].id;.      bre
282a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
282b0 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49  if( i>=sizeof(aI
282c0 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d  d)/sizeof(aId[0]
282d0 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
282e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
282f0 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74  , "unknown limit
28300 20 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28   type: ", zId, (
28310 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
28320 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28330 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
28340 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
28350 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
28360 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
28370 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
28380 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20  lite3_limit(db, 
28390 69 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f  id, val);.  Tcl_
283a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
283b0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
283c0 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
283d0 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
283e0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61  *.** tclcmd:  sa
283f0 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a  ve_prng_state.**
28400 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74 61  .** Save the sta
28410 74 65 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  te of the pseudo
28420 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67  -random number g
28430 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20  enerator..** At 
28440 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 76  the same time, v
28450 65 72 69 66 79 20 74 68 61 74 20 73 71 6c 69 74  erify that sqlit
28460 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20  e3_test_control 
28470 77 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a  works even when.
28480 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
28490 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f  n out-of-range o
284a0 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
284b0 20 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f 73   int save_prng_s
284c0 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  tate(.  ClientDa
284d0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
284e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
284f0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
28500 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
28510 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
28520 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
28530 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
28540 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
28550 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
28560 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
28570 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
28580 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
28590 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
285a0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
285b0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
285c0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
285d0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
285e0 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74 28  9999);.  assert(
285f0 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d   rc==0 );.  rc =
28600 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
28610 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73  ntrol(-1);.  ass
28620 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
28630 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
28640 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
28650 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b  CTRL_PRNG_SAVE);
28660 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
28670 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
28680 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f  :  restore_prng_
28690 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20  state.*/.static 
286a0 69 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e 67  int restore_prng
286b0 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
286c0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
286d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
286e0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
286f0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
28700 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28710 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
28720 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
28730 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
28740 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
28750 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
28760 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28770 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
28780 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
28790 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
287a0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
287b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
287c0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
287d0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
287e0 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e  STORE);.  return
287f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
28800 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f   tclcmd:  reset_
28810 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74  prng_state.*/.st
28820 61 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f 70  atic int reset_p
28830 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69  rng_state(.  Cli
28840 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
28850 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
28860 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
28870 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
28880 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
28890 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
288a0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
288b0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
288c0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
288d0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
288e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
288f0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
28900 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
28910 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
28920 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
28930 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74  /.){.  sqlite3_t
28940 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
28950 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
28960 5f 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72  _RESET);.  retur
28970 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
28980 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74 61  ** tclcmd:  data
28990 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72  base_may_be_corr
289a0 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61  upt.**.** Indica
289b0 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73 65  te that database
289c0 20 66 69 6c 65 73 20 6d 69 67 68 74 20 62 65 20   files might be 
289d0 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 74 68  corrupt.  In oth
289e0 65 72 20 77 6f 72 64 73 2c 20 73 65 74 20 74 68  er words, set th
289f0 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 73 74 61 74  e normal.** stat
28a00 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  e of operation..
28a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
28a20 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
28a30 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44  rrupt(.  ClientD
28a40 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
28a50 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
28a60 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
28a70 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
28a80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
28a90 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
28aa0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
28ab0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
28ac0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
28ad0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
28ae0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28af0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
28b00 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28b10 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
28b20 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
28b30 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
28b40 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
28b50 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
28b60 52 52 55 50 54 2c 20 30 29 3b 0a 20 20 72 65 74  RRUPT, 0);.  ret
28b70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
28b80 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74  .** tclcmd:  dat
28b90 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
28ba0 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61  upt.**.** Indica
28bb0 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73 65  te that database
28bc0 20 66 69 6c 65 73 20 61 72 65 20 61 6c 77 61 79   files are alway
28bd0 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
28be0 54 68 69 73 20 65 6e 61 62 6c 65 73 20 65 78 74  This enables ext
28bf0 72 61 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  ra assert().** s
28c00 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 74  tatements that t
28c10 65 73 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  est conditions t
28c20 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74  hat are always t
28c30 72 75 65 20 66 6f 72 20 77 65 6c 6c 2d 66 6f 72  rue for well-for
28c40 6d 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  med databases..*
28c50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74  /.static int dat
28c60 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
28c70 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  upt(.  ClientDat
28c80 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
28c90 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
28ca0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
28cb0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
28cc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28cd0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
28ce0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
28cf0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
28d00 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
28d10 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
28d20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
28d30 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
28d40 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
28d50 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
28d60 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
28d70 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
28d80 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
28d90 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
28da0 55 50 54 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  UPT, 1);.  retur
28db0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
28dc0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63  ** tclcmd:  pcac
28dd0 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74  he_stats.*/.stat
28de0 69 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61 63  ic int test_pcac
28df0 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65  he_stats(.  Clie
28e00 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28e10 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
28e20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
28e30 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
28e40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28e50 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28e60 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
28e70 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
28e80 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
28e90 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
28ea0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28eb0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
28ec0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28ed0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
28ee0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
28ef0 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a  .){.  int nMin;.
28f00 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e    int nMax;.  in
28f10 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e  t nCurrent;.  in
28f20 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20  t nRecyclable;. 
28f30 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
28f40 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
28f50 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c  Stats(&nCurrent,
28f60 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26   &nMax, &nMin, &
28f70 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20  nRecyclable);.. 
28f80 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
28f90 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  bj();.  Tcl_List
28fa0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
28fb0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
28fc0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
28fd0 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b  "current", -1));
28fe0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
28ff0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
29000 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
29010 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74  wIntObj(nCurrent
29020 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
29030 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
29040 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
29050 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
29060 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ax", -1));.  Tcl
29070 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
29080 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
29090 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
290a0 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f  j(nMax));.  Tcl_
290b0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
290c0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
290d0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
290e0 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b  Obj("min", -1));
290f0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
29100 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
29110 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
29120 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a  wIntObj(nMin));.
29130 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
29140 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
29150 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
29160 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63  StringObj("recyc
29170 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20  lable", -1));.  
29180 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
29190 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
291a0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
291b0 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65  tObj(nRecyclable
291c0 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ));..  Tcl_SetOb
291d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
291e0 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pRet);..  return
291f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64   TCL_OK;.}..#ifd
29200 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
29210 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
29220 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
29230 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62  unlock_notify_cb
29240 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e  (void **aArg, in
29250 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
29260 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  i;.  for(ii=0; i
29270 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20  i<nArg; ii++){. 
29280 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54     Tcl_EvalEx((T
29290 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67  cl_Interp *)aArg
292a0 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f  [ii], "unlock_no
292b0 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  tify", -1, TCL_E
292c0 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d  VAL_GLOBAL);.  }
292d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
292e0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
292f0 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a  K_NOTIFY */../*.
29300 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
29310 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
29320 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y db.*/.#ifdef S
29330 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
29340 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69  OCK_NOTIFY.stati
29350 63 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f 63  c int test_unloc
29360 6b 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69 65  k_notify(.  Clie
29370 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
29380 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
29390 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
293a0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
293b0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
293c0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
293d0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
293e0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
293f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29400 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
29410 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
29420 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
29430 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
29440 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
29450 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
29460 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
29470 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
29480 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
29490 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
294a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
294b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
294c0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
294d0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
294e0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
294f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
29500 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
29510 20 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63   = sqlite3_unloc
29520 6b 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65 73  k_notify(db, tes
29530 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  t_unlock_notify_
29540 63 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65  cb, (void *)inte
29550 72 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  rp);.  Tcl_SetRe
29560 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
29570 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
29580 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
29590 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
295a0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
295b0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
295c0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
295d0 69 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f  int db ?NAME?.*/
295e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
295f0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
29600 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
29610 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
29620 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
29630 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
29640 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
29650 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
29660 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
29670 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
29680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29690 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
296a0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
296b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
296c0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
296d0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ents */.){.  cha
296e0 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71  r *zDb = 0;.  sq
296f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
29700 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
29710 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29  !=3 && objc!=2 )
29720 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
29730 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
29740 2c 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41 4d  , objv, "DB ?NAM
29750 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E?");.    return
29760 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29770 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
29780 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
29790 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
297a0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
297b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
297c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
297d0 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d  ==3 ){.    zDb =
297e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
297f0 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72  bjv[2]);.  }.  r
29800 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  c = sqlite3_wal_
29810 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
29820 44 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  Db);.  Tcl_SetRe
29830 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
29840 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
29850 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
29860 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
29870 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
29880 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61  cmd:  sqlite3_wa
29890 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 20  l_checkpoint_v2 
298a0 64 62 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a  db MODE ?NAME?.*
298b0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  *.** This comman
298c0 64 20 63 61 6c 6c 73 20 74 68 65 20 77 61 6c 5f  d calls the wal_
298d0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20  checkpoint_v2() 
298e0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
298f0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6d  e specified.** m
29900 6f 64 65 20 61 72 67 75 6d 65 6e 74 20 28 70 61  ode argument (pa
29910 73 73 69 76 65 2c 20 66 75 6c 6c 20 6f 72 20 72  ssive, full or r
29920 65 73 74 61 72 74 29 2e 20 49 66 20 70 72 65 73  estart). If pres
29930 65 6e 74 2c 20 74 68 65 20 64 61 74 61 62 61 73  ent, the databas
29940 65 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69  e name.** NAME i
29950 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
29960 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
29970 74 6f 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  to wal_checkpoin
29980 74 5f 76 32 28 29 2e 20 49 66 20 69 74 20 74 68  t_v2(). If it th
29990 65 0a 2a 2a 20 4e 41 4d 45 20 61 72 67 75 6d 65  e.** NAME argume
299a0 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
299b0 74 2c 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  t, a NULL pointe
299c0 72 20 69 73 20 70 61 73 73 65 64 20 69 6e 73 74  r is passed inst
299d0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61  ead..**.** If wa
299e0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
299f0 29 20 72 65 74 75 72 6e 73 20 61 6e 79 20 76 61  ) returns any va
29a00 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  lue other than S
29a10 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 0a 2a 2a  QLITE_BUSY or.**
29a20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
29a30 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65   this command re
29a40 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52 2e  turns TCL_ERROR.
29a50 20 54 68 65 20 54 63 6c 20 72 65 73 75 6c 74 20   The Tcl result 
29a60 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65  is set.** to the
29a70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f   error message o
29a80 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
29a90 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2e 0a 2a  ite3_errmsg()..*
29aa0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
29ab0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74  this command ret
29ac0 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 74  urns a list of t
29ad0 68 72 65 65 20 69 6e 74 65 67 65 72 73 2e 20 54  hree integers. T
29ae0 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
29af0 0a 2a 2a 20 69 73 20 31 20 69 66 20 53 51 4c 49  .** is 1 if SQLI
29b00 54 45 5f 42 55 53 59 20 77 61 73 20 72 65 74 75  TE_BUSY was retu
29b10 72 6e 65 64 2c 20 6f 72 20 30 20 6f 74 68 65 72  rned, or 0 other
29b20 77 69 73 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  wise. The follow
29b30 69 6e 67 20 74 77 6f 20 69 6e 74 65 67 65 72 73  ing two integers
29b40 0a 2a 2a 20 61 72 65 20 74 68 65 20 76 61 6c 75  .** are the valu
29b50 65 73 20 72 65 74 75 72 6e 65 64 20 76 69 61 20  es returned via 
29b60 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
29b70 65 74 65 72 73 20 62 79 20 77 61 6c 5f 63 68 65  eters by wal_che
29b80 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 2d 0a 2a  ckpoint_v2() -.*
29b90 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
29ba0 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
29bb0 67 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  g and the number
29bc0 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
29bd0 65 20 6c 6f 67 0a 2a 2a 20 74 68 61 74 20 68 61  e log.** that ha
29be0 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69  ve been checkpoi
29bf0 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
29c00 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  int test_wal_che
29c10 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 43 6c  ckpoint_v2(.  Cl
29c20 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
29c30 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
29c40 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
29c50 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
29c60 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
29c70 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
29c80 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
29c90 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
29ca0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29cb0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
29cc0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
29cd0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
29ce0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
29cf0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
29d00 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
29d10 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
29d20 0a 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a 20 20  .  int eMode;.  
29d30 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35 35 3b  int nLog = -555;
29d40 0a 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d 20 2d  .  int nCkpt = -
29d50 35 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  555;.  Tcl_Obj *
29d60 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  pRet;..  const c
29d70 68 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d 20  har * aMode[] = 
29d80 7b 20 22 70 61 73 73 69 76 65 22 2c 20 22 66 75  { "passive", "fu
29d90 6c 6c 22 2c 20 22 72 65 73 74 61 72 74 22 2c 20  ll", "restart", 
29da0 22 74 72 75 6e 63 61 74 65 22 2c 20 30 20 7d 3b  "truncate", 0 };
29db0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
29dc0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
29dd0 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73  SIVE==0 );.  ass
29de0 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
29df0 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29  KPOINT_FULL==1 )
29e00 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
29e10 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
29e20 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73  START==2 );.  as
29e30 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
29e40 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45  CKPOINT_TRUNCATE
29e50 3d 3d 33 20 29 3b 0a 0a 20 20 69 66 28 20 6f 62  ==3 );..  if( ob
29e60 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
29e70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
29e80 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
29e90 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4d 4f   1, objv, "DB MO
29ea0 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20  DE ?NAME?");.   
29eb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29ec0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
29ed0 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 44 62  jc==4 ){.    zDb
29ee0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
29ef0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 20  (objv[3]);.  }. 
29f00 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
29f10 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
29f20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
29f30 2c 20 26 64 62 29 20 7c 7c 20 28 0a 20 20 20 20  , &db) || (.    
29f40 20 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65    TCL_OK!=Tcl_Ge
29f50 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f  tIntFromObj(0, o
29f60 62 6a 76 5b 32 5d 2c 20 26 65 4d 6f 64 65 29 0a  bjv[2], &eMode).
29f70 20 20 20 26 26 20 54 43 4c 5f 4f 4b 21 3d 54 63     && TCL_OK!=Tc
29f80 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
29f90 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
29fa0 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64 65 22  ], aMode, "mode"
29fb0 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a 20 20  , 0, &eMode) .  
29fc0 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  )){.    return T
29fd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
29fe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61   rc = sqlite3_wa
29ff0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
2a000 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c 20  db, zDb, eMode, 
2a010 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b 0a  &nLog, &nCkpt);.
2a020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a030 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
2a040 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 63 6f  E_BUSY ){.    co
2a050 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 43 6f  nst char *zErrCo
2a060 64 65 20 3d 20 73 71 6c 69 74 65 33 45 72 72 4e  de = sqlite3ErrN
2a070 61 6d 65 28 72 63 29 3b 0a 20 20 20 20 54 63 6c  ame(rc);.    Tcl
2a080 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
2a090 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  erp);.    Tcl_Ap
2a0a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2a0b0 70 2c 20 7a 45 72 72 43 6f 64 65 2c 20 22 20 2d  p, zErrCode, " -
2a0c0 20 22 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69   ", (char *)sqli
2a0d0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
2a0e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2a0f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2a100 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
2a110 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  bj();.  Tcl_List
2a120 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2a130 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
2a140 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 3d  cl_NewIntObj(rc=
2a150 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a 30  =SQLITE_BUSY?1:0
2a160 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
2a170 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2a180 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
2a190 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67 29  _NewIntObj(nLog)
2a1a0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
2a1b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2a1c0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
2a1d0 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74 29  NewIntObj(nCkpt)
2a1e0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
2a1f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
2a200 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  et);..  return T
2a210 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2a220 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
2a230 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
2a240 69 6e 74 20 64 62 20 56 41 4c 55 45 0a 2a 2f 0a  int db VALUE.*/.
2a250 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2a260 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
2a270 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
2a280 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2a290 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2a2a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2a2b0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2a2c0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2a2d0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2a2e0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2a2f0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2a300 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2a310 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2a320 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2a330 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2a340 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2a350 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2a360 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 56 61  nt rc;.  int iVa
2a370 6c 3b 0a 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  l;...  if( objc!
2a380 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
2a390 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2a3a0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
2a3b0 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74  VALUE");.    ret
2a3c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2a3d0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
2a3e0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2a3f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2a400 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20  v[1]), &db) .   
2a410 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  || Tcl_GetIntFro
2a420 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c  mObj(0, objv[2],
2a430 20 26 69 56 61 6c 29 0a 20 20 29 7b 0a 20 20 20   &iVal).  ){.   
2a440 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a450 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  R;.  }..  rc = s
2a460 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
2a470 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 56  heckpoint(db, iV
2a480 61 6c 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74  al);.  Tcl_Reset
2a490 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2a4a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
2a4c0 20 63 68 61 72 20 2a 7a 45 72 72 43 6f 64 65 20   char *zErrCode 
2a4d0 3d 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  = sqlite3ErrName
2a4e0 28 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  (rc);.    Tcl_Se
2a4f0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2a500 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
2a510 4f 62 6a 28 7a 45 72 72 43 6f 64 65 2c 20 2d 31  Obj(zErrCode, -1
2a520 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
2a530 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2a540 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2a550 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
2a560 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  :  test_sqlite3_
2a570 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a  log ?SCRIPT?.*/.
2a580 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c 6f  static struct Lo
2a590 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54 63  gCallback {.  Tc
2a5a0 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72  l_Interp *pInter
2a5b0 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  p;.  Tcl_Obj *pO
2a5c0 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61 63  bj;.} logcallbac
2a5d0 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61 74  k = {0, 0};.stat
2a5e0 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c 6c  ic void xLogcall
2a5f0 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73 65  back(void *unuse
2a600 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61 72  d, int err, char
2a610 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f 4f   *zMsg){.  Tcl_O
2a620 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f 44  bj *pNew = Tcl_D
2a630 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67 63  uplicateObj(logc
2a640 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
2a650 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
2a660 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f 4c  t(pNew);.  Tcl_L
2a670 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2a680 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70 4e  ent(.      0, pN
2a690 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ew, Tcl_NewStrin
2a6a0 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e  gObj(sqlite3ErrN
2a6b0 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20 20  ame(err), -1).  
2a6c0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
2a6d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
2a6e0 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74   pNew, Tcl_NewSt
2a6f0 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31  ringObj(zMsg, -1
2a700 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
2a710 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  jEx(logcallback.
2a720 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54  pInterp, pNew, T
2a730 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54  CL_EVAL_GLOBAL|T
2a740 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
2a750 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
2a760 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61  unt(pNew);.}.sta
2a770 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
2a780 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65  ite3_log(.  Clie
2a790 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2a7a0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2a7b0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2a7c0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2a7d0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2a7e0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2a7f0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2a800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a810 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2a820 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2a830 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2a840 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2a850 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a   */.){.  if( obj
2a860 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c>2 ){.    Tcl_W
2a870 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2a880 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 1, objv, "SC
2a890 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75  RIPT");.    retu
2a8a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a8b0 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62  }.  if( logcallb
2a8c0 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20  ack.pObj ){.    
2a8d0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2a8e0 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
2a8f0 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
2a900 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20  ack.pObj = 0;.  
2a910 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49    logcallback.pI
2a920 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73  nterp = 0;.    s
2a930 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
2a940 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
2a950 20 28 76 6f 69 64 2a 29 30 2c 20 28 76 6f 69 64   (void*)0, (void
2a960 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  *)0);.  }.  if( 
2a970 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f  objc>1 ){.    lo
2a980 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d  gcallback.pObj =
2a990 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63   objv[1];.    Tc
2a9a0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c  l_IncrRefCount(l
2a9b0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29  ogcallback.pObj)
2a9c0 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63  ;.    logcallbac
2a9d0 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e 74 65  k.pInterp = inte
2a9e0 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rp;.    sqlite3_
2a9f0 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
2aa00 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61  NFIG_LOG, xLogca
2aa10 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 30  llback, (void*)0
2aa20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2aa30 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2aa40 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63       tcl_objproc
2aa50 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47   COMMANDNAME ARG
2aa60 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61  S....**.** Run a
2aa70 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69   TCL command usi
2aa80 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63 20 69  ng its objProc i
2aa90 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72 6f 77  nterface.  Throw
2aaa0 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20   an error if.** 
2aab0 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20  the command has 
2aac0 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72  no objProc inter
2aad0 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  face..*/.static 
2aae0 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63  int runAsObjProc
2aaf0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2ab00 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2ab10 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2ab20 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2ab30 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2ab40 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
2ab50 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28  o cmdInfo;.  if(
2ab60 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
2ab70 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2ab80 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2ab90 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b   "COMMAND ...");
2aba0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2abb0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2abc0 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
2abd0 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
2abe0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2abf0 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  1]), &cmdInfo) )
2ac00 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2ac10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2ac20 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
2ac30 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
2ac40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2ac50 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
2ac60 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2ac70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2ac80 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50  if( cmdInfo.objP
2ac90 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  roc==0 ){.    Tc
2aca0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2acb0 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
2acc0 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20  has no objProc: 
2acd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63  ",.           Tc
2ace0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2acf0 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
2ad00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2ad10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2ad20 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50  urn cmdInfo.objP
2ad30 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  roc(cmdInfo.objC
2ad40 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72  lientData, inter
2ad50 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b  p, objc-1, objv+
2ad60 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
2ad70 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2ad80 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  IN./*.** WARNING
2ad90 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  : The following 
2ada0 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45  function, printE
2adb0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
2adc0 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a  ) is an exact.**
2add0 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c 65   copy of example
2ade0 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e 69   code from eqp.i
2adf0 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66  n (eqp.html). If
2ae00 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f   this code is mo
2ae10 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  dified,.** then 
2ae20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  the documentatio
2ae30 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74 6f 20  n copy needs to 
2ae40 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 77  be modified as w
2ae50 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72  ell..*/./*.** Ar
2ae60 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20  gument pStmt is 
2ae70 61 20 70 72 65 70 61 72 65 64 20 53 51 4c 20 73  a prepared SQL s
2ae80 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66  tatement. This f
2ae90 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73  unction compiles
2aea0 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  .** an EXPLAIN Q
2aeb0 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e  UERY PLAN comman
2aec0 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74  d to report on t
2aed0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
2aee0 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72  ement,.** and pr
2aef0 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72 74 20  ints the report 
2af00 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e 67 20  to stdout using 
2af10 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74  printf()..*/.int
2af20 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
2af30 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73  ryPlan(sqlite3_s
2af40 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63  tmt *pStmt){.  c
2af50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af70 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20  * Input SQL */. 
2af80 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b   char *zExplain;
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afa0 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45 58 50   /* SQL with EXP
2afb0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2afc0 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73  prepended */.  s
2afd0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
2afe0 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 2f  plain;         /
2aff0 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41  * Compiled EXPLA
2b000 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2b010 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72  mmand */.  int r
2b020 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2b040 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
2b050 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2b060 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d  2() */..  zSql =
2b070 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
2b080 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  mt);.  if( zSql=
2b090 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2b0a0 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78  TE_ERROR;..  zEx
2b0b0 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  plain = sqlite3_
2b0c0 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e  mprintf("EXPLAIN
2b0d0 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c   QUERY PLAN %s",
2b0e0 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45   zSql);.  if( zE
2b0f0 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75  xplain==0 ) retu
2b100 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2b110 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2b120 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71 6c 69  _prepare_v2(sqli
2b130 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53  te3_db_handle(pS
2b140 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20  tmt), zExplain, 
2b150 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
2b160 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2b170 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69  e(zExplain);.  i
2b180 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b190 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
2b1a0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
2b1b0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2b1c0 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20  (pExplain) ){.  
2b1d0 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69 64 20    int iSelectid 
2b1e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2b1f0 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
2b200 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65  );.    int iOrde
2b210 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
2b220 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
2b230 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 46 72   1);.    int iFr
2b240 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  om = sqlite3_col
2b250 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
2b260 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 2);.    const 
2b270 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20  char *zDetail = 
2b280 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2b290 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2b2a0 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a  t(pExplain, 3);.
2b2b0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 20  .    printf("%d 
2b2c0 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69 53 65  %d %d %s\n", iSe
2b2d0 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72 2c 20  lectid, iOrder, 
2b2e0 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b  iFrom, zDetail);
2b2f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
2b300 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2b310 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74  pExplain);.}..st
2b320 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
2b330 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64 20  int_eqp(.  void 
2b340 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2b350 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2b360 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2b370 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2b380 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
2b390 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
2b3a0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
2b3b0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2b3c0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2b3d0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2b3e0 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
2b3f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2b400 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2b410 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
2b420 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2b430 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
2b440 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
2b450 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70  _ERROR;.  rc = p
2b460 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79  rintExplainQuery
2b470 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f  Plan(pStmt);.  /
2b480 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64  * This is needed
2b490 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20 74   on Windows so t
2b4a0 68 61 74 20 61 20 74 65 73 74 20 63 61 73 65 20  hat a test case 
2b4b0 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a  using this .  **
2b4c0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70   function can op
2b4d0 65 6e 20 61 20 72 65 61 64 20 70 69 70 65 20 61  en a read pipe a
2b4e0 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  nd get the outpu
2b4f0 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45  t of.  ** printE
2b500 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
2b510 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  ) immediately.. 
2b520 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74 64   */.  fflush(std
2b530 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  out);.  Tcl_SetR
2b540 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2b550 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
2b560 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
2b570 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2b580 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2b590 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
2b5a0 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  /*.** sqlite3_te
2b5b0 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20  st_control VERB 
2b5c0 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69  ARGS....*/.stati
2b5d0 63 20 69 6e 74 20 74 65 73 74 5f 74 65 73 74 5f  c int test_test_
2b5e0 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20  control(.  void 
2b5f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2b600 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2b610 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2b620 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2b630 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72   objv[].){.  str
2b640 75 63 74 20 56 65 72 62 20 7b 0a 20 20 20 20 63  uct Verb {.    c
2b650 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2b660 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d  ;.    int i;.  }
2b670 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20   aVerb[] = {.   
2b680 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43   { "SQLITE_TESTC
2b690 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
2b6a0 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54 45 53  ULT", SQLITE_TES
2b6b0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
2b6c0 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20  FAULT }, .    { 
2b6d0 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
2b6e0 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c 20 20  _SORTER_MMAP",  
2b6f0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2b700 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20 20  RL_SORTER_MMAP  
2b710 20 20 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51     }, .    { "SQ
2b720 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2b730 50 4f 53 54 45 52 22 2c 20 20 20 20 20 20 20 20  POSTER",        
2b740 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2b750 49 4d 50 4f 53 54 45 52 20 20 20 20 20 20 20 20  IMPOSTER        
2b760 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 56  },.  };.  int iV
2b770 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c 61 67  erb;.  int iFlag
2b780 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
2b790 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
2b7a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2b7b0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2b7c0 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e 2e 2e  v, "VERB ARGS...
2b7d0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2b7e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2b7f0 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64   rc = Tcl_GetInd
2b800 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28  exFromObjStruct(
2b810 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f  .      interp, o
2b820 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c 20 73  bjv[1], aVerb, s
2b830 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d 29 2c  izeof(aVerb[0]),
2b840 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69 56 65   "VERB", 0, &iVe
2b850 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  rb.  );.  if( rc
2b860 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72  !=TCL_OK ) retur
2b870 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67 20 3d  n rc;..  iFlag =
2b880 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e 69 3b   aVerb[iVerb].i;
2b890 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c 61 67  .  switch( iFlag
2b8a0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
2b8b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
2b8c0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
2b8d0 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20        int val;. 
2b8e0 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
2b8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
2b900 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2b910 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4f  erp, 2, objv, "O
2b920 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20 20  NOFF");.        
2b930 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2b940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b950 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
2b960 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
2b970 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
2b980 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2b990 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
2b9a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2b9b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2b9c0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
2b9d0 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65   val);.      bre
2b9e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
2b9f0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
2ba00 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a  TRL_SORTER_MMAP:
2ba10 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c   {.      int val
2ba20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  ;.      sqlite3 
2ba30 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  *db;.      if( o
2ba40 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
2ba50 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2ba60 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
2ba70 6a 76 2c 20 22 44 42 20 4c 49 4d 49 54 22 29 3b  jv, "DB LIMIT");
2ba80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ba90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2baa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 65 74   }.      if( get
2bab0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2bac0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2bad0 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20 29  objv[2]), &db) )
2bae0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2baf0 52 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  R;.      if( Tcl
2bb00 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2bb10 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
2bb20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
2bb30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
2bb40 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2bb50 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
2bb60 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
2bb70 2c 20 64 62 2c 20 76 61 6c 29 3b 0a 20 20 20 20  , db, val);.    
2bb80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
2bb90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2bba0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2bbb0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  R: {.      int o
2bbc0 6e 4f 66 66 2c 20 74 6e 75 6d 3b 0a 20 20 20 20  nOff, tnum;.    
2bbd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2bbe0 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  bName;.      sql
2bbf0 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20 20  ite3 *db;.      
2bc00 69 66 28 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20  if( objc!=6 ){. 
2bc10 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
2bc20 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2bc30 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 4e  2, objv, "DB dbN
2bc40 61 6d 65 20 6f 6e 4f 66 66 20 74 6e 75 6d 22 29  ame onOff tnum")
2bc50 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2bc60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2bc70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 65    }.      if( ge
2bc80 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2bc90 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2bca0 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20  (objv[2]), &db) 
2bcb0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2bcc0 4f 52 3b 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d  OR;.      zDbNam
2bcd0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
2bce0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
2bcf0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2bd00 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2bd10 6f 62 6a 76 5b 34 5d 2c 20 26 6f 6e 4f 66 66 29  objv[4], &onOff)
2bd20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2bd30 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ROR;.      if( T
2bd40 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2bd50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
2bd60 2c 20 26 74 6e 75 6d 29 20 29 20 72 65 74 75 72  , &tnum) ) retur
2bd70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2bd80 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
2bd90 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2bda0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2bdb0 2c 20 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 6f  , db, zDbName, o
2bdc0 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20  nOff, tnum);.   
2bdd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2bde0 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74    }..  Tcl_Reset
2bdf0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2be00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2be10 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
2be20 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75 64 65 20  S_UNIX.#include 
2be30 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
2be40 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75  clude <sys/resou
2be50 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69 63 20 69  rce.h>..static i
2be60 6e 74 20 74 65 73 74 5f 67 65 74 72 75 73 61 67  nt test_getrusag
2be70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
2be80 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2be90 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2bea0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2beb0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2bec0 5d 0a 29 7b 0a 20 20 63 68 61 72 20 62 75 66 5b  ].){.  char buf[
2bed0 31 30 32 34 5d 3b 0a 20 20 73 74 72 75 63 74 20  1024];.  struct 
2bee0 72 75 73 61 67 65 20 72 3b 0a 20 20 6d 65 6d 73  rusage r;.  mems
2bef0 65 74 28 26 72 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&r, 0, sizeof
2bf00 28 72 29 29 3b 0a 20 20 67 65 74 72 75 73 61 67  (r));.  getrusag
2bf10 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26  e(RUSAGE_SELF, &
2bf20 72 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  r);..  sqlite3_s
2bf30 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 62  nprintf(sizeof(b
2bf40 75 66 29 2c 20 62 75 66 2c 0a 20 20 20 20 22 72  uf), buf,.    "r
2bf50 75 5f 75 74 69 6d 65 3d 25 64 2e 25 30 36 64 20  u_utime=%d.%06d 
2bf60 72 75 5f 73 74 69 6d 65 3d 25 64 2e 25 30 36 64  ru_stime=%d.%06d
2bf70 20 72 75 5f 6d 69 6e 66 6c 74 3d 25 64 20 72 75   ru_minflt=%d ru
2bf80 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c 20 0a 20 20  _majflt=%d", .  
2bf90 20 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d    (int)r.ru_utim
2bfa0 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72  e.tv_sec, (int)r
2bfb0 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73 65  .ru_utime.tv_use
2bfc0 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72  c, .    (int)r.r
2bfd0 75 5f 73 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20  u_stime.tv_sec, 
2bfe0 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e  (int)r.ru_stime.
2bff0 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69  tv_usec, .    (i
2c000 6e 74 29 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20  nt)r.ru_minflt, 
2c010 28 69 6e 74 29 72 2e 72 75 5f 6d 61 6a 66 6c 74  (int)r.ru_majflt
2c020 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  .  );.  Tcl_SetO
2c030 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2c040 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2c050 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 20 20 72  j(buf, -1));.  r
2c060 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2c070 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
2c080 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  TE_OS_WIN./*.** 
2c090 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  Information pass
2c0a0 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
2c0b0 20 74 68 72 65 61 64 20 69 6e 74 6f 20 74 68 65   thread into the
2c0c0 20 77 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f   windows file lo
2c0d0 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75  cker.** backgrou
2c0e0 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74  nd thread..*/.st
2c0f0 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
2c100 63 6b 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 65  cker {.  char *e
2c110 76 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20  vName;       /* 
2c120 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74 20 74 6f  Name of event to
2c130 20 73 69 67 6e 61 6c 20 74 68 72 65 61 64 20 73   signal thread s
2c140 74 61 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44  tartup */.  HAND
2c150 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  LE h;           
2c160 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20 74 68 65  /* Handle of the
2c170 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
2c180 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61  ed */.  int dela
2c190 79 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  y1;         /* D
2c1a0 65 6c 61 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b  elay before lock
2c1b0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ing */.  int del
2c1c0 61 79 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ay2;         /* 
2c1d0 44 65 6c 61 79 20 62 65 66 6f 72 65 20 75 6e 6c  Delay before unl
2c1e0 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  ocking */.  int 
2c1f0 6f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ok;             
2c200 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a  /* Finished ok *
2c210 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20 20 20 20  /.  int err;    
2c220 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c230 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2c240 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a  rs */.};.#endif.
2c250 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2c260 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72  WIN.#include <pr
2c270 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54  ocess.h>./*.** T
2c280 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68  he background th
2c290 72 65 61 64 20 74 68 61 74 20 64 6f 65 73 20 66  read that does f
2c2a0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ile locking..*/.
2c2b0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 33  static void win3
2c2c0 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f  2_file_locker(vo
2c2d0 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
2c2e0 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c   struct win32Fil
2c2f0 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28 73 74  eLocker *p = (st
2c300 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
2c310 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61 3b 0a  cker*)pAppData;.
2c320 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d 65 20    if( p->evName 
2c330 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 65 76  ){.    HANDLE ev
2c340 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45 56 45   = OpenEvent(EVE
2c350 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54 45 2c  NT_MODIFY_STATE,
2c360 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e 61 6d   FALSE, p->evNam
2c370 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65 76 20  e);.    if ( ev 
2c380 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76 65 6e  ){.      SetEven
2c390 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43 6c 6f  t(ev);.      Clo
2c3a0 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
2c3b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
2c3c0 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65 70 28  >delay1 ) Sleep(
2c3d0 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20 69 66  p->delay1);.  if
2c3e0 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c  ( LockFile(p->h,
2c3f0 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30   0, 0, 100000000
2c400 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c 65 65  , 0) ){.    Slee
2c410 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a 20 20  p(p->delay2);.  
2c420 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e    UnlockFile(p->
2c430 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30  h, 0, 0, 1000000
2c440 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6f  00, 0);.    p->o
2c450 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k = 1;.  }else{.
2c460 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31 3b 0a      p->err = 1;.
2c470 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
2c480 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68 20  e(p->h);.  p->h 
2c490 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 31  = 0;.  p->delay1
2c4a0 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79   = 0;.  p->delay
2c4b0 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  2 = 0;.}.#endif.
2c4c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2c4d0 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f  IN./*.**      lo
2c4e0 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49  ck_win32_file FI
2c4f0 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
2c500 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61  LAY2.**.** Get a
2c510 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61 6e 64  n exclusive mand
2c520 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20 66 69  itory lock on fi
2c530 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20 6d 69  le for DELAY2 mi
2c540 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57  lliseconds..** W
2c550 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c 6c 69  ait DELAY1 milli
2c560 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 61  seconds before a
2c570 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c 6f 63  cquiring the loc
2c580 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
2c590 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
2c5a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2c5b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2c5c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2c5d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2c5e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2c5f0 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  .){.  static str
2c600 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
2c610 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32  ker x = { "win32
2c620 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20  _file_lock", 0, 
2c630 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
2c640 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c650 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42  ename;.  char zB
2c660 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72  uf[200];.  int r
2c670 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44  etry = 0;.  HAND
2c680 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77  LE ev;.  DWORD w
2c690 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28  Result;.  .  if(
2c6a0 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
2c6b0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
2c6c0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2c6d0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
2c6e0 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
2c6f0 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75  LAY2");.    retu
2c700 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2c710 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20  }.  if( objc==1 
2c720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2c730 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2c740 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20  Buf), zBuf, "%d 
2c750 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20  %d %d %d %d",.  
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c770 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20     x.ok, x.err, 
2c780 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61  x.delay1, x.dela
2c790 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63  y2, x.h);.    Tc
2c7a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2c7b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
2c7c0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2c7d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20  rn TCL_OK;.  }. 
2c7e0 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72   while( x.h && r
2c7f0 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72  etry<30 ){.    r
2c800 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65  etry++;.    Slee
2c810 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66  p(100);.  }.  if
2c820 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c  ( x.h ){.    Tcl
2c830 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2c840 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63  terp, "busy", (c
2c850 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2c860 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2c870 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
2c880 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2c890 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64  p, objv[2], &x.d
2c8a0 65 6c 61 79 31 29 20 29 20 72 65 74 75 72 6e 20  elay1) ) return 
2c8b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
2c8c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2c8d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2c8e0 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29  3], &x.delay2) )
2c8f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c900 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  R;.  zFilename =
2c910 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2c920 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d  bjv[1]);.  x.h =
2c930 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c   CreateFile(zFil
2c940 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52  ename, GENERIC_R
2c950 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54  EAD|GENERIC_WRIT
2c960 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2c970 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
2c980 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54  |FILE_SHARE_WRIT
2c990 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59  E, 0, OPEN_ALWAY
2c9a0 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
2c9b0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
2c9c0 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66  NORMAL, 0);.  if
2c9d0 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63  ( !x.h ){.    Tc
2c9e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2c9f0 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
2ca00 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69  pen file: ", zFi
2ca10 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  lename, (char*)0
2ca20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2ca30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65  L_ERROR;.  }.  e
2ca40 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28  v = CreateEvent(
2ca50 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53  NULL, TRUE, FALS
2ca60 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20  E, x.evName);.  
2ca70 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20  if ( !ev ){.    
2ca80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2ca90 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
2caa0 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22   create event: "
2cab0 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61  , x.evName, (cha
2cac0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2cad0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2cae0 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28  .  _beginthread(
2caf0 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65  win32_file_locke
2cb00 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29  r, 0, (void*)&x)
2cb10 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20  ;.  Sleep(0);.  
2cb20 69 66 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20  if ( (wResult = 
2cb30 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
2cb40 65 63 74 28 65 76 2c 20 31 30 30 30 30 29 29 21  ect(ev, 10000))!
2cb50 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29  =WAIT_OBJECT_0 )
2cb60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2cb70 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2cb80 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78  uf), zBuf, "0x%x
2cb90 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20  ", wResult);.   
2cba0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2cbb0 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20  t(interp, "wait 
2cbc0 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c  failed: ", zBuf,
2cbd0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2cbe0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
2cbf0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2cc00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f  ERROR;.  }.  Clo
2cc10 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
2cc20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2cc30 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69  ../*.**      exi
2cc40 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 20 50  sts_win32_path P
2cc50 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ATH.**.** Return
2cc60 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2cc70 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
2cc80 20 65 78 69 73 74 73 2c 20 77 68 6f 73 65 20 66   exists, whose f
2cc90 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2cca0 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65  ame.** may excee
2ccb0 64 20 32 36 30 20 63 68 61 72 61 63 74 65 72 73  d 260 characters
2ccc0 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2ccd0 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a  ed with "\\?\"..
2cce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2ccf0 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68 28  n32_exists_path(
2cd00 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2cd10 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2cd20 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2cd30 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2cd40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2cd50 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2cd60 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2cd70 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2cd80 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29  1, objv, "PATH")
2cd90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2cda0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
2cdb0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2cdc0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
2cdd0 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20  oleanObj(.      
2cde0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2cdf0 73 57 28 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f  sW( Tcl_GetUnico
2ce00 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e  de(objv[1]))!=IN
2ce10 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
2ce20 42 55 54 45 53 20 29 29 3b 0a 20 20 72 65 74 75  BUTES ));.  retu
2ce30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2ce40 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64 5f 77 69  .**      find_wi
2ce50 6e 33 32 5f 66 69 6c 65 20 50 41 54 54 45 52 4e  n32_file PATTERN
2ce60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61  .**.** Returns a
2ce70 20 6c 69 73 74 20 6f 66 20 65 6e 74 72 69 65 73   list of entries
2ce80 20 69 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20   in a directory 
2ce90 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 73  that match the s
2cea0 70 65 63 69 66 69 65 64 20 70 61 74 74 65 72 6e  pecified pattern
2ceb0 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79  ,.** whose fully
2cec0 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20   qualified name 
2ced0 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 20 63  may exceed 248 c
2cee0 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2cef0 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2cf00 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  .** "\\?\"..*/.s
2cf10 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
2cf20 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f 69  find_file(.  voi
2cf30 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
2cf40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2cf50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2cf60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2cf70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41  T objv[].){.  HA
2cf80 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65 20 3d  NDLE hFindFile =
2cf90 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
2cfa0 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f 46  VALUE;.  WIN32_F
2cfb0 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64 44 61  IND_DATAW findDa
2cfc0 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c  ta;.  Tcl_Obj *l
2cfd0 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44 20  istObj;.  DWORD 
2cfe0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28  lastErrno;.  if(
2cff0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2d000 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2d010 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2d020 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a 20 20  , "PATTERN");.  
2d030 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d040 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64 46  OR;.  }.  hFindF
2d050 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73 74 46  ile = FindFirstF
2d060 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63  ileW(Tcl_GetUnic
2d070 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 66  ode(objv[1]), &f
2d080 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66 28 20  indData);.  if( 
2d090 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41 4c  hFindFile==INVAL
2d0a0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
2d0b0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
2d0c0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2d0d0 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2d0e0 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
2d0f0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
2d100 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2d110 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  listObj = Tcl_Ne
2d120 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e  wObj();.  Tcl_In
2d130 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f  crRefCount(listO
2d140 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  bj);.  do {.    
2d150 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2d160 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2d170 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65   listObj, Tcl_Ne
2d180 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20 20  wUnicodeObj(.   
2d190 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 63 46       findData.cF
2d1a0 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  ileName, -1));. 
2d1b0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2d1c0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2d1d0 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c  rp, listObj, Tcl
2d1e0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 0a  _NewWideIntObj(.
2d1f0 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61          findData
2d200 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
2d210 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20  s));.  } while( 
2d220 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68 46  FindNextFileW(hF
2d230 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64 44 61  indFile, &findDa
2d240 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45 72 72  ta) );.  lastErr
2d250 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
2d260 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73 74 45  r();.  if( lastE
2d270 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20 26  rrno!=NO_ERROR &
2d280 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  & lastErrno!=ERR
2d290 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53  OR_NO_MORE_FILES
2d2a0 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f 73   ){.    FindClos
2d2b0 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20  e(hFindFile);.  
2d2c0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2d2d0 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 20  nt(listObj);.   
2d2e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2d2f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2d300 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c  wWideIntObj(GetL
2d310 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20  astError()));.  
2d320 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d330 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43 6c  OR;.  }.  FindCl
2d340 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a  ose(hFindFile);.
2d350 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2d360 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  lt(interp, listO
2d370 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  bj);.  return TC
2d380 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
2d390 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33 32      delete_win32
2d3a0 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a 2a  _file FILENAME.*
2d3b0 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74 68 65  *.** Deletes the
2d3c0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
2d3d0 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
2d3e0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
2d3f0 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20 63 68  exceed 260.** ch
2d400 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
2d410 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
2d420 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
2d430 63 20 69 6e 74 20 77 69 6e 33 32 5f 64 65 6c 65  c int win32_dele
2d440 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20  te_file(.  void 
2d450 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
2d460 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2d470 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2d480 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2d490 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
2d4a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2d4b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2d4c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2d4d0 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20   "FILENAME");.  
2d4e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d4f0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44  OR;.  }.  if( !D
2d500 65 6c 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47  eleteFileW(Tcl_G
2d510 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2d520 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ])) ){.    Tcl_S
2d530 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2d540 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
2d550 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72  ntObj(GetLastErr
2d560 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75  or()));.    retu
2d570 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d580 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  }.  Tcl_ResetRes
2d590 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
2d5a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2d5b0 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65  ./*.**      make
2d5c0 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43  _win32_dir DIREC
2d5d0 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74  TORY.**.** Creat
2d5e0 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
2d5f0 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73   directory, whos
2d600 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2d610 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
2d620 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74  d 248.** charact
2d630 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
2d640 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
2d650 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2d660 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20   win32_mkdir(.  
2d670 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2d680 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2d690 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2d6a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2d6b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2d6c0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
2d6d0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2d6e0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2d6f0 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59  objv, "DIRECTORY
2d700 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2d710 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2d720 69 66 28 20 21 43 72 65 61 74 65 44 69 72 65 63  if( !CreateDirec
2d730 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69  toryW(Tcl_GetUni
2d740 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  code(objv[1]), N
2d750 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ULL) ){.    Tcl_
2d760 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2d770 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
2d780 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72  IntObj(GetLastEr
2d790 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74  ror()));.    ret
2d7a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2d7b0 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65   }.  Tcl_ResetRe
2d7c0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
2d7d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2d7e0 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d  ../*.**      rem
2d7f0 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49  ove_win32_dir DI
2d800 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65  RECTORY.**.** Re
2d810 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63 69 66  moves the specif
2d820 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77  ied directory, w
2d830 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69  hose fully quali
2d840 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78  fied name may ex
2d850 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72  ceed 248.** char
2d860 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
2d870 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c  prefixed with "\
2d880 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  \?\"..*/.static 
2d890 69 6e 74 20 77 69 6e 33 32 5f 72 6d 64 69 72 28  int win32_rmdir(
2d8a0 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2d8b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2d8c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2d8d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2d8e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2d8f0 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2d900 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2d910 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2d920 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54  1, objv, "DIRECT
2d930 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ORY");.    retur
2d940 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d950 0a 20 20 69 66 28 20 21 52 65 6d 6f 76 65 44 69  .  if( !RemoveDi
2d960 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74  rectoryW(Tcl_Get
2d970 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2d980 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
2d990 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2d9a0 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2d9b0 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2d9c0 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2d9d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2d9e0 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2d9f0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2da00 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2da10 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  ndif.../*.**    
2da20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63    optimization_c
2da30 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f  ontrol DB OPT BO
2da40 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62  OLEAN.**.** Enab
2da50 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 71 75  le or disable qu
2da60 65 72 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ery optimization
2da70 73 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  s using the sqli
2da80 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2da90 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
2daa0 20 20 44 69 73 61 62 6c 65 20 69 66 20 42 4f 4f    Disable if BOO
2dab0 4c 45 41 4e 20 69 73 20 66 61 6c 73 65 20 61 6e  LEAN is false an
2dac0 64 20 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c  d enable if BOOL
2dad0 45 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20  EAN is true..** 
2dae0 4f 50 54 20 69 73 20 74 68 65 20 6e 61 6d 65 20  OPT is the name 
2daf0 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  of the optimizat
2db00 69 6f 6e 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ion to be disabl
2db10 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2db20 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63  t optimization_c
2db30 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a  ontrol(.  void *
2db40 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2db50 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2db60 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2db70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2db80 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2db90 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2dba0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2dbb0 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66  zOpt;.  int onof
2dbc0 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20  f;.  int mask = 
2dbd0 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  0;.  static cons
2dbe0 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
2dbf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e  onst char *zOptN
2dc00 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73  ame;.    int mas
2dc10 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20  k;.  } aOpt[] = 
2dc20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20  {.    { "all",  
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2dc40 51 4c 49 54 45 5f 41 6c 6c 4f 70 74 73 20 20 20  QLITE_AllOpts   
2dc50 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e       },.    { "n
2dc60 6f 6e 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  one",           
2dc70 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
2dc80 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2dc90 20 20 7b 20 22 71 75 65 72 79 2d 66 6c 61 74 74    { "query-flatt
2dca0 65 6e 65 72 22 2c 20 20 20 20 20 53 51 4c 49 54  ener",     SQLIT
2dcb0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
2dcc0 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d   },.    { "colum
2dcd0 6e 2d 63 61 63 68 65 22 2c 20 20 20 20 20 20 20  n-cache",       
2dce0 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
2dcf0 63 68 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  che    },.    { 
2dd00 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c  "groupby-order",
2dd10 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 47 72         SQLITE_Gr
2dd20 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a  oupByOrder   },.
2dd30 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f      { "factor-co
2dd40 6e 73 74 61 6e 74 73 22 2c 20 20 20 20 53 51 4c  nstants",    SQL
2dd50 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e  ITE_FactorOutCon
2dd60 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73  st },.    { "dis
2dd70 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20 20  tinct-opt",     
2dd80 20 20 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e     SQLITE_Distin
2dd90 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20 20  ctOpt    },.    
2dda0 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d 73 63 61  { "cover-idx-sca
2ddb0 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  n",      SQLITE_
2ddc0 43 6f 76 65 72 49 64 78 53 63 61 6e 20 20 20 7d  CoverIdxScan   }
2ddd0 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65 72 2d 62  ,.    { "order-b
2dde0 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53  y-idx-join",   S
2ddf0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
2de00 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74  Join },.    { "t
2de10 72 61 6e 73 69 74 69 76 65 22 2c 20 20 20 20 20  ransitive",     
2de20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 72 61 6e       SQLITE_Tran
2de30 73 69 74 69 76 65 20 20 20 20 20 7d 2c 0a 20 20  sitive     },.  
2de40 20 20 7b 20 22 73 75 62 71 75 65 72 79 2d 63 6f    { "subquery-co
2de50 72 6f 75 74 69 6e 65 22 2c 20 20 53 51 4c 49 54  routine",  SQLIT
2de60 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 20  E_SubqCoroutine 
2de70 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d   },.    { "omit-
2de80 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20  noop-join",     
2de90 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
2dea0 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Join   },.    { 
2deb0 22 73 74 61 74 33 22 2c 20 20 20 20 20 20 20 20  "stat3",        
2dec0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74         SQLITE_St
2ded0 61 74 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a  at34         },.
2dee0 20 20 20 20 7b 20 22 73 74 61 74 34 22 2c 20 20      { "stat4",  
2def0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2df00 49 54 45 5f 53 74 61 74 33 34 20 20 20 20 20 20  ITE_Stat34      
2df10 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66     },.  };..  if
2df20 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
2df30 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2df40 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2df50 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45  v, "DB OPT BOOLE
2df60 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  AN");.    return
2df70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2df80 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2df90 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2dfa0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2dfb0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
2dfc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
2dfd0 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
2dfe0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2dff0 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29  objv[3], &onoff)
2e000 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2e010 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63  ROR;.  zOpt = Tc
2e020 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2e030 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [2]);.  for(i=0;
2e040 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f   i<sizeof(aOpt)/
2e050 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b  sizeof(aOpt[0]);
2e060 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2e070 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74  trcmp(zOpt, aOpt
2e080 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30  [i].zOptName)==0
2e090 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d   ){.      mask =
2e0a0 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20   aOpt[i].mask;. 
2e0b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e0c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66  }.  }.  if( onof
2e0d0 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b  f ) mask = ~mask
2e0e0 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  ;.  if( i>=sizeo
2e0f0 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61  f(aOpt)/sizeof(a
2e100 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54  Opt[0]) ){.    T
2e110 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2e120 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
2e130 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
2e140 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
2e150 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  :",.            
2e160 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2e170 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0);.    for(i=0;
2e180 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f   i<sizeof(aOpt)/
2e190 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b  sizeof(aOpt[0]);
2e1a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
2e1b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2e1c0 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b  terp, " ", aOpt[
2e1d0 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68  i].zOptName, (ch
2e1e0 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ar*)0);.    }.  
2e1f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2e200 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
2e210 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2e220 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2e230 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62  PTIMIZATIONS, db
2e240 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65 74 75 72  , mask);.  retur
2e250 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70  n TCL_OK;.}..typ
2e260 65 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69  edef struct sqli
2e270 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2e280 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2e290 74 69 6e 65 73 3b 0a 2f 2a 0a 2a 2a 20 20 20 20  tines;./*.**    
2e2a0 20 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74   load_static_ext
2e2b0 65 6e 73 69 6f 6e 20 44 42 20 4e 41 4d 45 20 2e  ension DB NAME .
2e2c0 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61 64 20 6f 6e  ...**.** Load on
2e2d0 65 20 6f 72 20 6d 6f 72 65 20 73 74 61 74 69 63  e or more static
2e2e0 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 65 78 74 65  ally linked exte
2e2f0 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  nsions..*/.stati
2e300 63 20 69 6e 74 20 74 63 6c 4c 6f 61 64 53 74 61  c int tclLoadSta
2e310 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 28  ticExtensionCmd(
2e320 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2e330 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2e340 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2e350 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2e360 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2e370 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
2e380 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69  sqlite3_amatch_i
2e390 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2e3a0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2e3b0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2e3c0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2e3d0 71 6c 69 74 65 33 5f 63 61 72 72 61 79 5f 69 6e  qlite3_carray_in
2e3e0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2e3f0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2e400 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2e410 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2e420 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e  lite3_closure_in
2e430 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2e440 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2e450 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2e460 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2e470 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 28 73  lite3_csv_init(s
2e480 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2e490 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2e4a0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2e4b0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2e4c0 33 5f 65 76 61 6c 5f 69 6e 69 74 28 73 71 6c 69  3_eval_init(sqli
2e4d0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2e4e0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2e4f0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2e500 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
2e510 69 6c 65 69 6f 5f 69 6e 69 74 28 73 71 6c 69 74  ileio_init(sqlit
2e520 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2e530 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2e540 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2e550 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  n int sqlite3_fu
2e560 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69 74 65  zzer_init(sqlite
2e570 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2e580 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2e590 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2e5a0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 65 65   int sqlite3_iee
2e5b0 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  e_init(sqlite3*,
2e5c0 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2e5d0 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2e5e0 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2e5f0 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68  t sqlite3_nextch
2e600 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ar_init(sqlite3*
2e610 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2e620 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2e630 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2e640 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72 63 65  nt sqlite3_perce
2e650 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69 74  ntile_init(sqlit
2e660 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2e670 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2e680 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2e690 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65  n int sqlite3_re
2e6a0 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65  gexp_init(sqlite
2e6b0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2e6c0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2e6d0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2e6e0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 72   int sqlite3_ser
2e6f0 69 65 73 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ies_init(sqlite3
2e700 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2e710 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2e720 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2e730 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65 6c  int sqlite3_spel
2e740 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74 65  lfix_init(sqlite
2e750 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2e760 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2e770 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2e780 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74   int sqlite3_tot
2e790 79 70 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ype_init(sqlite3
2e7a0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2e7b0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2e7c0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2e7d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c  int sqlite3_whol
2e7e0 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c  enumber_init(sql
2e7f0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2e800 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2e810 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74 61  outines*);.  sta
2e820 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2e830 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
2e840 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20 20  r *zExtName;.   
2e850 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28 73 71   int (*pInit)(sq
2e860 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2e870 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2e880 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d 20  routines*);.  } 
2e890 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20 7b  aExtension[] = {
2e8a0 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68 22 2c  .    { "amatch",
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8c0 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69  sqlite3_amatch_i
2e8d0 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2e8e0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 61 72 72    },.    { "carr
2e8f0 61 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ay",            
2e900 20 20 20 20 73 71 6c 69 74 65 33 5f 63 61 72 72      sqlite3_carr
2e910 61 79 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ay_init         
2e920 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2e930 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20 20 20  closure",       
2e940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e950 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20 20 20  closure_init    
2e960 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2e970 20 7b 20 22 63 73 76 22 2c 20 20 20 20 20 20 20   { "csv",       
2e980 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e990 74 65 33 5f 63 73 76 5f 69 6e 69 74 20 20 20 20  te3_csv_init    
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2e9b0 0a 20 20 20 20 7b 20 22 65 76 61 6c 22 2c 20 20  .    { "eval",  
2e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9d0 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69  sqlite3_eval_ini
2e9e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e9f0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65    },.    { "file
2ea00 69 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  io",            
2ea10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
2ea20 69 6f 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  io_init         
2ea30 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2ea40 66 75 7a 7a 65 72 22 2c 20 20 20 20 20 20 20 20  fuzzer",        
2ea50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ea60 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20 20 20 20  fuzzer_init     
2ea70 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2ea80 20 7b 20 22 69 65 65 65 37 35 34 22 2c 20 20 20   { "ieee754",   
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2eaa0 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 20 20 20  te3_ieee_init   
2eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2eac0 0a 20 20 20 20 7b 20 22 6e 65 78 74 63 68 61 72  .    { "nextchar
2ead0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2eae0 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61 72  sqlite3_nextchar
2eaf0 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2eb00 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 65 72 63    },.    { "perc
2eb10 65 6e 74 69 6c 65 22 2c 20 20 20 20 20 20 20 20  entile",        
2eb20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 65 72 63      sqlite3_perc
2eb30 65 6e 74 69 6c 65 5f 69 6e 69 74 20 20 20 20 20  entile_init     
2eb40 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2eb50 72 65 67 65 78 70 22 2c 20 20 20 20 20 20 20 20  regexp",        
2eb60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2eb70 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20 20 20  regexp_init     
2eb80 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2eb90 20 7b 20 22 73 65 72 69 65 73 22 2c 20 20 20 20   { "series",    
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ebb0 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69 74 20  te3_series_init 
2ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2ebd0 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66 69 78  .    { "spellfix
2ebe0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2ebf0 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78  sqlite3_spellfix
2ec00 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2ec10 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 79    },.    { "toty
2ec20 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  pe",            
2ec30 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 74 79      sqlite3_toty
2ec40 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  pe_init         
2ec50 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2ec60 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20 20 20  wholenumber",   
2ec70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ec80 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74  wholenumber_init
2ec90 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d            },.  }
2eca0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2ecb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ecc0 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Name;.  int i, j
2ecd0 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  , rc;.  char *zE
2ece0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66 28  rrMsg = 0;.  if(
2ecf0 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 54   objc<3 ){.    T
2ed00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2ed10 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2ed20 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b   "DB NAME ...");
2ed30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2ed40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2ed50 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2ed60 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2ed70 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2ed80 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2ed90 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d 32  ERROR;.  for(j=2
2eda0 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a  ; j<objc; j++){.
2edb0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
2edc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6a  GetString(objv[j
2edd0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
2ede0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 45 78   i<ArraySize(aEx
2edf0 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a  tension); i++){.
2ee00 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2ee10 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e 73 69  (zName, aExtensi
2ee20 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d  on[i].zExtName)=
2ee30 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2ee40 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72 72  }.    if( i>=Arr
2ee50 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73 69 6f  aySize(aExtensio
2ee60 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  n) ){.      Tcl_
2ee70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2ee80 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 65 78  erp, "no such ex
2ee90 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d  tension: ", zNam
2eea0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
2eeb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2eec0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
2eed0 69 66 28 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69  if( aExtension[i
2eee0 5d 2e 70 49 6e 69 74 20 29 7b 0a 20 20 20 20 20  ].pInit ){.     
2eef0 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69 6f 6e   rc = aExtension
2ef00 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26 7a  [i].pInit(db, &z
2ef10 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20  ErrMsg, 0);.    
2ef20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2ef30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2ef40 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2ef50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72  QLITE_OK || zErr
2ef60 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  Msg ){.      Tcl
2ef70 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2ef80 74 65 72 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a  terp, "initializ
2ef90 61 74 69 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d  ation of ", zNam
2efa0 65 2c 20 22 20 66 61 69 6c 65 64 3a 20 22 2c 20  e, " failed: ", 
2efb0 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20  zErrMsg,.       
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efd0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
2efe0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2eff0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 65  rrMsg);.      re
2f000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2f010 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2f020 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2f030 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74  .**     sorter_t
2f040 65 73 74 5f 66 61 6b 65 68 65 61 70 20 42 4f 4f  est_fakeheap BOO
2f050 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  L.**.*/.static i
2f060 6e 74 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66  nt sorter_test_f
2f070 61 6b 65 68 65 61 70 28 0a 20 20 76 6f 69 64 20  akeheap(.  void 
2f080 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2f090 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2f0a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2f0b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2f0c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
2f0d0 20 62 41 72 67 3b 0a 20 20 69 66 28 20 6f 62 6a   bArg;.  if( obj
2f0e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2f0f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2f100 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42  erp, 1, objv, "B
2f110 4f 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72  OOL");.    retur
2f120 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2f130 0a 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  ..  if( Tcl_GetB
2f140 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
2f150 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
2f160 62 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65 74  bArg) ){.    ret
2f170 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2f180 20 7d 0a 0a 20 20 69 66 28 20 62 41 72 67 20 29   }..  if( bArg )
2f190 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2f1a0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
2f1b0 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eap==0 ){.      
2f1c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2f1d0 66 69 67 2e 70 48 65 61 70 20 3d 20 53 51 4c 49  fig.pHeap = SQLI
2f1e0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31  TE_INT_TO_PTR(-1
2f1f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2f200 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2f210 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
2f220 65 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 5f  eap==SQLITE_INT_
2f230 54 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a 20 20  TO_PTR(-1) ){.  
2f240 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2f250 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
2f260 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2f270 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2f280 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
2f290 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2f2a0 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65  **     sorter_te
2f2b0 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20  st_sort4_helper 
2f2c0 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53 51  DB SQL1 NSTEP SQ
2f2d0 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  L2.**.** Compile
2f2e0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 24   SQL statement $
2f2f0 53 51 4c 31 20 61 6e 64 20 73 74 65 70 20 69 74  SQL1 and step it
2f300 20 24 4e 53 54 45 50 20 74 69 6d 65 73 2e 20 46   $NSTEP times. F
2f310 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 0a 2a 2a  or each row, .**
2f320 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
2f330 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 72 69 67  leftmost and rig
2f340 68 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 72  htmost columns r
2f350 65 74 75 72 6e 65 64 20 61 72 65 20 62 6f 74 68  eturned are both
2f360 20 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20 61 6e   integers,.** an
2f370 64 20 74 68 61 74 20 62 6f 74 68 20 63 6f 6e 74  d that both cont
2f380 61 69 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c  ain the same val
2f390 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 65  ue..**.** Then e
2f3a0 78 65 63 75 74 65 20 73 74 61 74 65 6d 65 6e 74  xecute statement
2f3b0 20 24 53 51 4c 32 2e 20 43 68 65 63 6b 20 74 68   $SQL2. Check th
2f3c0 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
2f3d0 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d   returns the sam
2f3e0 65 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e 74 65  e.** set of inte
2f3f0 67 65 72 73 20 69 6e 20 74 68 65 20 73 61 6d 65  gers in the same
2f400 20 6f 72 64 65 72 20 61 73 20 69 6e 20 74 68 65   order as in the
2f410 20 70 72 65 76 69 6f 75 73 20 73 74 65 70 20 28   previous step (
2f420 75 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a 2a 2f  using $SQL1)..*/
2f430 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
2f440 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65  er_test_sort4_he
2f450 6c 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  lper(.  void * c
2f460 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2f470 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2f480 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2f490 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2f4a0 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
2f4b0 63 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20 63  char *zSql1;.  c
2f4c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32  onst char *zSql2
2f4d0 3b 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20 0a  ;.  int nStep; .
2f4e0 20 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20 20    int iStep; .  
2f4f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6b  unsigned int iCk
2f500 73 75 6d 31 20 3d 20 30 3b 20 0a 20 20 75 6e 73  sum1 = 0; .  uns
2f510 69 67 6e 65 64 20 69 6e 74 20 69 43 6b 73 75 6d  igned int iCksum
2f520 32 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 72 63  2 = 0; .  int rc
2f530 3b 0a 20 20 69 6e 74 20 69 42 3b 0a 20 20 73 71  ;.  int iB;.  sq
2f540 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
2f550 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2f560 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
2f570 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
2f580 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2f590 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
2f5a0 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 22  SQL1 NSTEP SQL2"
2f5b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2f5c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2f5d0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2f5e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2f5f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2f600 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2f610 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
2f620 31 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  1 = Tcl_GetStrin
2f630 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
2f640 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2f650 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2f660 5b 33 5d 2c 20 26 6e 53 74 65 70 29 20 29 20 72  [3], &nStep) ) r
2f670 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2f680 0a 20 20 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47  .  zSql2 = Tcl_G
2f690 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
2f6a0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
2f6b0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
2f6c0 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53  , zSql1, -1, &pS
2f6d0 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
2f6e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2f6f0 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a  oto sql_error;..
2f700 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 5f 63    iB = sqlite3_c
2f710 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
2f720 74 29 2d 31 3b 0a 20 20 66 6f 72 28 69 53 74 65  t)-1;.  for(iSte
2f730 70 3d 30 3b 20 69 53 74 65 70 3c 6e 53 74 65 70  p=0; iStep<nStep
2f740 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
2f750 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2f760 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20  mt); iStep++){. 
2f770 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74     int a = sqlit
2f780 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2f790 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
2f7a0 20 61 21 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75   a!=sqlite3_colu
2f7b0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 42  mn_int(pStmt, iB
2f7c0 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ) ){.      Tcl_A
2f7d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2f7e0 72 70 2c 20 22 64 61 74 61 20 65 72 72 6f 72 3a  rp, "data error:
2f7f0 20 28 61 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20   (a!=b)", 0);.  
2f800 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2f810 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
2f820 20 69 43 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b   iCksum1 += (iCk
2f830 73 75 6d 31 20 3c 3c 20 33 29 20 2b 20 28 75 6e  sum1 << 3) + (un
2f840 73 69 67 6e 65 64 20 69 6e 74 29 61 3b 0a 20 20  signed int)a;.  
2f850 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
2f860 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2f870 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2f880 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c  TE_OK ) goto sql
2f890 5f 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d 20  _error;..  rc = 
2f8a0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2f8b0 76 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d 31  v2(db, zSql2, -1
2f8c0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2f8d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f8e0 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72  K ) goto sql_err
2f8f0 6f 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d  or;.  for(iStep=
2f900 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  0; SQLITE_ROW==s
2f910 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2f920 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20  t); iStep++){.  
2f930 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65    int a = sqlite
2f940 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2f950 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b 73  mt, 0);.    iCks
2f960 75 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32 20  um2 += (iCksum2 
2f970 3c 3c 20 33 29 20 2b 20 28 75 6e 73 69 67 6e 65  << 3) + (unsigne
2f980 64 20 69 6e 74 29 61 3b 0a 20 20 7d 0a 20 20 72  d int)a;.  }.  r
2f990 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
2f9a0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
2f9b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f9c0 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f   ) goto sql_erro
2f9d0 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73 75 6d  r;..  if( iCksum
2f9e0 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20 20  1!=iCksum2 ){.  
2f9f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2fa00 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 68 65 63  lt(interp, "chec
2fa10 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c 20  ksum mismatch", 
2fa20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2fa30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2fa40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2fa50 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54 63   sql_error:.  Tc
2fa60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2fa70 6e 74 65 72 70 2c 20 22 73 71 6c 20 65 72 72 6f  nterp, "sql erro
2fa80 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
2fa90 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
2faa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2fab0 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
2fac0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2fad0 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64 65  ICATION.#include
2fae0 20 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74   "sqlite3useraut
2faf0 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  h.h"./*.** tclcm
2fb00 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
2fb10 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20 44 42  _authenticate DB
2fb20 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
2fb30 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  RD.*/.static int
2fb40 20 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68 65   test_user_authe
2fb50 6e 74 69 63 61 74 65 28 0a 20 20 43 6c 69 65 6e  nticate(.  Clien
2fb60 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2fb70 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
2fb80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2fb90 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2fba0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2fbb0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2fbc0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2fbd0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2fbe0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fbf0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2fc00 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2fc10 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2fc20 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2fc30 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72  ){.  char *zUser
2fc40 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50   = 0;.  char *zP
2fc50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74  asswd = 0;.  int
2fc60 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20   nPasswd = 0;.  
2fc70 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2fc80 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
2fc90 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
2fca0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2fcb0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2fcc0 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
2fcd0 57 4f 52 44 22 29 3b 0a 20 20 20 20 72 65 74 75  WORD");.    retu
2fce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2fcf0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2fd00 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2fd10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2fd20 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
2fd30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fd40 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d  R;.  }.  zUser =
2fd50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2fd60 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73  bjv[2]);.  zPass
2fd70 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  wd = Tcl_GetStri
2fd80 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
2fd90 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20  ], &nPasswd);.  
2fda0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  rc = sqlite3_use
2fdb0 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 64  r_authenticate(d
2fdc0 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77  b, zUser, zPassw
2fdd0 64 2c 20 6e 50 61 73 73 77 64 29 3b 0a 20 20 54  d, nPasswd);.  T
2fde0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
2fdf0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
2fe00 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
2fe10 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
2fe20 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2fe30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55  ndif /* SQLITE_U
2fe40 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2fe50 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ON */..#ifdef SQ
2fe60 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
2fe70 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74  TICATION./*.** t
2fe80 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
2fe90 75 73 65 72 5f 61 64 64 20 44 42 20 55 53 45 52  user_add DB USER
2fea0 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53  NAME PASSWORD IS
2feb0 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20  ADMIN.*/.static 
2fec0 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61 64  int test_user_ad
2fed0 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
2fee0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
2fef0 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
2ff00 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2ff10 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2ff20 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2ff30 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2ff40 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2ff50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ff60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2ff70 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2ff80 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2ff90 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2ffa0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
2ffb0 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a  har *zUser = 0;.
2ffc0 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20    char *zPasswd 
2ffd0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73  = 0;.  int nPass
2ffe0 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  wd = 0;.  int is
2fff0 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  Admin = 0;.  sql
30000 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
30010 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
30020 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
30030 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
30040 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
30050 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
30060 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20  D ISADMIN");.   
30070 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
30080 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
30090 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
300a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
300b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
300c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
300d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55  _ERROR;.  }.  zU
300e0 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ser = Tcl_GetStr
300f0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
30100 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65  zPasswd = Tcl_Ge
30110 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
30120 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64  bjv[3], &nPasswd
30130 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  );.  Tcl_GetBool
30140 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
30150 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41  p, objv[4], &isA
30160 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71  dmin);.  rc = sq
30170 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28 64  lite3_user_add(d
30180 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77  b, zUser, zPassw
30190 64 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41 64  d, nPasswd, isAd
301a0 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  min);.  Tcl_SetR
301b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
301c0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
301d0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
301e0 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
301f0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
30200 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
30210 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a  HENTICATION */..
30220 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53  #ifdef SQLITE_US
30230 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
30240 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  N./*.** tclcmd: 
30250 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68   sqlite3_user_ch
30260 61 6e 67 65 20 44 42 20 55 53 45 52 4e 41 4d 45  ange DB USERNAME
30270 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49   PASSWORD ISADMI
30280 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  N.*/.static int 
30290 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67 65  test_user_change
302a0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
302b0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
302c0 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
302d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
302e0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
302f0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
30300 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
30310 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
30320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30330 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
30340 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
30350 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
30360 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
30370 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
30380 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20  ar *zUser = 0;. 
30390 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d   char *zPasswd =
303a0 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77   0;.  int nPassw
303b0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 41  d = 0;.  int isA
303c0 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69  dmin = 0;.  sqli
303d0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
303e0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
303f0 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
30400 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
30410 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55  , 1, objv, "DB U
30420 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44  SERNAME PASSWORD
30430 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20   ISADMIN");.    
30440 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30450 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
30460 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
30470 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
30480 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
30490 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
304a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73  ERROR;.  }.  zUs
304b0 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  er = Tcl_GetStri
304c0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
304d0 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74  Passwd = Tcl_Get
304e0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
304f0 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29  jv[3], &nPasswd)
30500 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  ;.  Tcl_GetBoole
30510 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
30520 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64  , objv[4], &isAd
30530 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  min);.  rc = sql
30540 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65  ite3_user_change
30550 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73  (db, zUser, zPas
30560 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69 73  swd, nPasswd, is
30570 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65  Admin);.  Tcl_Se
30580 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
30590 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
305a0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
305b0 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
305c0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
305d0 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  /* SQLITE_USER_A
305e0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f  UTHENTICATION */
305f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
30600 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
30610 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ION./*.** tclcmd
30620 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  :  sqlite3_user_
30630 64 65 6c 65 74 65 20 44 42 20 55 53 45 52 4e 41  delete DB USERNA
30640 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ME.*/.static int
30650 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65 74   test_user_delet
30660 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
30670 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
30680 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
30690 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
306a0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
306b0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
306c0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
306d0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
306e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
306f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
30700 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
30710 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
30720 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
30730 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
30740 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a  har *zUser = 0;.
30750 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
30760 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
30770 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
30780 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
30790 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
307a0 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29 3b   "DB USERNAME");
307b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
307c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
307d0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
307e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
307f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
30800 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
30810 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
30820 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65    zUser = Tcl_Ge
30830 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
30840 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
30850 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62 2c  _user_delete(db,
30860 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f 53   zUser);.  Tcl_S
30870 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
30880 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
30890 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
308a0 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
308b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
308c0 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
308d0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
308e0 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  /../*.** tclcmd:
308f0 20 62 61 64 5f 62 65 68 61 76 69 6f 72 20 54 59   bad_behavior TY
30900 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d 65  PE.**.** Do some
30910 20 74 68 69 6e 67 73 20 74 68 61 74 20 73 68 6f   things that sho
30920 75 6c 64 20 74 72 69 67 67 65 72 20 61 20 76 61  uld trigger a va
30930 6c 67 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e 69  lgrind or -fsani
30940 74 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a 2a  tize=undefined.*
30950 2a 20 77 61 72 6e 69 6e 67 2e 20 20 54 68 69 73  * warning.  This
30960 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69   is used to veri
30970 66 79 20 74 68 61 74 20 65 72 72 6f 72 73 20 61  fy that errors a
30980 6e 64 20 77 61 72 6e 69 6e 67 73 20 6f 75 74 70  nd warnings outp
30990 75 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20 74  ut by those.** t
309a0 6f 6f 6c 73 20 61 72 65 20 64 65 74 65 63 74 65  ools are detecte
309b0 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73 63  d by the test sc
309c0 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ripts..**.**    
309d0 20 20 20 54 59 50 45 20 20 20 20 20 20 20 42 45     TYPE       BE
309e0 48 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20 20  HAVIOR.**       
309f0 31 20 20 20 20 20 20 20 20 20 20 4f 76 65 72 66  1          Overf
30a00 6c 6f 77 20 61 20 73 69 67 6e 65 64 20 69 6e 74  low a signed int
30a10 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 32 20  eger.**       2 
30a20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 62 61           Jump ba
30a30 73 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  sed on an uninit
30a40 69 61 6c 69 7a 65 64 20 76 61 72 69 61 62 6c 65  ialized variable
30a50 0a 2a 2a 20 20 20 20 20 20 20 33 20 20 20 20 20  .**       3     
30a60 20 20 20 20 20 52 65 61 64 20 61 66 74 65 72 20       Read after 
30a70 66 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 34 20  free.**       4 
30a80 20 20 20 20 20 20 20 20 20 50 61 6e 69 63 0a 2a           Panic.*
30a90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
30aa0 74 5f 62 61 64 5f 62 65 68 61 76 69 6f 72 28 0a  t_bad_behavior(.
30ab0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
30ac0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
30ad0 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
30ae0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72  r containing zer
30af0 6f 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  o */.  Tcl_Inter
30b00 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
30b10 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
30b20 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
30b30 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
30b40 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
30b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30b60 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
30b70 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
30b80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
30b90 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
30ba0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
30bb0 54 79 70 65 3b 0a 20 20 69 6e 74 20 78 79 7a 3b  Type;.  int xyz;
30bc0 0a 20 20 69 6e 74 20 69 20 3d 20 2a 28 69 6e 74  .  int i = *(int
30bd0 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  *)clientData;.  
30be0 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 77 5b 31  int j;.  int w[1
30bf0 30 5d 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a 20 20  0];.  int *a;.  
30c00 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
30c10 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
30c20 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
30c30 62 6a 76 2c 20 22 54 59 50 45 22 29 3b 0a 20 20  bjv, "TYPE");.  
30c40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
30c50 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
30c60 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
30c70 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
30c80 20 26 69 54 79 70 65 29 20 29 20 72 65 74 75 72   &iType) ) retur
30c90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
30ca0 77 69 74 63 68 28 20 69 54 79 70 65 20 29 7b 0a  witch( iType ){.
30cb0 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
30cc0 20 20 20 20 78 79 7a 20 3d 20 30 78 37 66 66 66      xyz = 0x7fff
30cd0 66 66 30 30 20 2d 20 69 3b 0a 20 20 20 20 20 20  ff00 - i;.      
30ce0 78 79 7a 20 2b 3d 20 30 78 31 30 30 3b 0a 20 20  xyz += 0x100;.  
30cf0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
30d00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
30d10 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 79 7a 29 29  _NewIntObj(xyz))
30d20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
30d30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
30d40 20 7b 0a 20 20 20 20 20 20 77 5b 31 5d 20 3d 20   {.      w[1] = 
30d50 35 3b 0a 20 20 20 20 20 20 69 66 28 20 77 5b 69  5;.      if( w[i
30d60 5d 3e 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20 20  ]>0 ) w[1]++;.  
30d70 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
30d80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
30d90 5f 4e 65 77 49 6e 74 4f 62 6a 28 77 5b 31 5d 29  _NewIntObj(w[1])
30da0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
30db0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
30dc0 3a 20 7b 0a 20 20 20 20 20 20 61 20 3d 20 6d 61  : {.      a = ma
30dd0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e 74  lloc( sizeof(int
30de0 29 2a 31 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  )*10 );.      fo
30df0 72 28 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b 2b  r(j=0; j<10; j++
30e00 29 20 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20 20  ) a[j] = j;.    
30e10 20 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20    free(a);.     
30e20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
30e30 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
30e40 77 49 6e 74 4f 62 6a 28 61 5b 69 5d 29 29 3b 0a  wIntObj(a[i]));.
30e50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30e60 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
30e70 0a 20 20 20 20 20 20 54 63 6c 5f 50 61 6e 69 63  .      Tcl_Panic
30e80 28 22 44 65 6c 69 62 65 72 61 74 65 20 70 61 6e  ("Deliberate pan
30e90 69 63 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ic");.      brea
30ea0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
30eb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20  eturn TCL_OK;.} 
30ec0 20 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a   ../*.** tclcmd:
30ed0 20 20 20 72 65 67 69 73 74 65 72 5f 64 62 73 74     register_dbst
30ee0 61 74 5f 76 74 61 62 20 44 42 0a 2a 2a 0a 2a 2a  at_vtab DB.**.**
30ef0 20 43 61 75 73 65 20 74 68 65 20 64 62 73 74 61   Cause the dbsta
30f00 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  t virtual table 
30f10 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  to be available 
30f20 6f 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  on the connectio
30f30 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n DB.*/.static i
30f40 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72  nt test_register
30f50 5f 64 62 73 74 61 74 5f 76 74 61 62 28 0a 20 20  _dbstat_vtab(.  
30f60 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
30f70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
30f80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
30f90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
30fa0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
30fb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
30fc0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
30fd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
30fe0 74 28 69 6e 74 65 72 70 2c 20 22 64 62 73 74 61  t(interp, "dbsta
30ff0 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  t not available 
31000 62 65 63 61 75 73 65 20 6f 66 20 22 0a 20 20 20  because of ".   
31010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31020 20 20 20 20 20 20 20 20 22 53 51 4c 49 54 45 5f          "SQLITE_
31030 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
31040 45 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  E", (void*)0);. 
31050 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31060 52 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  R;.#else.  struc
31070 74 20 53 71 6c 69 74 65 44 62 20 7b 20 73 71 6c  t SqliteDb { sql
31080 69 74 65 33 20 2a 64 62 3b 20 7d 3b 0a 20 20 63  ite3 *db; };.  c
31090 68 61 72 20 2a 7a 44 62 3b 0a 20 20 54 63 6c 5f  har *zDb;.  Tcl_
310a0 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
310b0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
310c0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
310d0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
310e0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
310f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
31100 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62  RROR;.  }..  zDb
31110 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
31120 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (objv[1]);.  if(
31130 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49   Tcl_GetCommandI
31140 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c  nfo(interp, zDb,
31150 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20   &cmdInfo) ){.  
31160 20 20 73 71 6c 69 74 65 33 2a 20 64 62 20 3d 20    sqlite3* db = 
31170 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ((struct SqliteD
31180 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  b*)cmdInfo.objCl
31190 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20  ientData)->db;. 
311a0 20 20 20 73 71 6c 69 74 65 33 44 62 73 74 61 74     sqlite3Dbstat
311b0 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20  Register(db);.  
311c0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
311d0 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  K;.#endif /* SQL
311e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
311f0 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  TABLE */.}../*.*
31200 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69  * tclcmd:   sqli
31210 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 44 42  te3_db_config DB
31220 20 53 45 54 54 49 4e 47 20 56 41 4c 55 45 0a 2a   SETTING VALUE.*
31230 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  *.** Invoke sqli
31240 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20  te3_db_config() 
31250 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
31260 65 74 74 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a  etting values..*
31270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
31280 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t_sqlite3_db_con
31290 66 69 67 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  fig(.  void *cli
312a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
312b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
312c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
312d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
312e0 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  [].){.  static c
312f0 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
31300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
31310 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 65 56 61  ame;.    int eVa
31320 6c 3b 0a 20 20 7d 20 61 53 65 74 74 69 6e 67 5b  l;.  } aSetting[
31330 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 46 4b 45  ] = {.    { "FKE
31340 59 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  Y",            S
31350 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
31360 4e 41 42 4c 45 5f 46 4b 45 59 20 7d 2c 0a 20 20  NABLE_FKEY },.  
31370 20 20 7b 20 22 54 52 49 47 47 45 52 22 2c 20 20    { "TRIGGER",  
31380 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
31390 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
313a0 49 47 47 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  IGGER },.    { "
313b0 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 22 2c  FTS3_TOKENIZER",
313c0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
313d0 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  G_ENABLE_FTS3_TO
313e0 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20 20 7b  KENIZER },.    {
313f0 20 22 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e   "LOAD_EXTENSION
31400 22 2c 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ",  SQLITE_DBCON
31410 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f  FIG_ENABLE_LOAD_
31420 45 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a 20 20 7d  EXTENSION },.  }
31430 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
31440 20 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   v;.  const char
31450 20 2a 7a 53 65 74 74 69 6e 67 3b 0a 20 20 73 71   *zSetting;.  sq
31460 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
31470 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
31480 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
31490 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
314a0 76 2c 20 22 44 42 20 53 45 54 54 49 4e 47 20 56  v, "DB SETTING V
314b0 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74 75  ALUE");.    retu
314c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
314d0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
314e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
314f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
31500 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
31510 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
31520 7a 53 65 74 74 69 6e 67 20 3d 20 54 63 6c 5f 47  zSetting = Tcl_G
31530 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
31540 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
31550 5f 73 74 72 67 6c 6f 62 28 22 53 51 4c 49 54 45  _strglob("SQLITE
31560 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d 3d  _*", zSetting)==
31570 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d 20  0 ) zSetting += 
31580 37 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  7;.  if( sqlite3
31590 5f 73 74 72 67 6c 6f 62 28 22 44 42 43 4f 4e 46  _strglob("DBCONF
315a0 49 47 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29  IG_*", zSetting)
315b0 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b  ==0 ) zSetting +
315c0 3d 20 39 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 9;.  if( sqlit
315d0 65 33 5f 73 74 72 67 6c 6f 62 28 22 45 4e 41 42  e3_strglob("ENAB
315e0 4c 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29  LE_*", zSetting)
315f0 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b  ==0 ) zSetting +
31600 3d 20 37 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 7;.  for(i=0; 
31610 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 65 74  i<ArraySize(aSet
31620 74 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  ting); i++){.   
31630 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 74   if( strcmp(zSet
31640 74 69 6e 67 2c 20 61 53 65 74 74 69 6e 67 5b 69  ting, aSetting[i
31650 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
31660 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
31670 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 53 65 74  >=ArraySize(aSet
31680 74 69 6e 67 29 20 29 7b 0a 20 20 20 20 54 63 6c  ting) ){.    Tcl
31690 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
316a0 74 65 72 70 2c 0a 20 20 20 20 20 20 54 63 6c 5f  terp,.      Tcl_
316b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e  NewStringObj("un
316c0 6b 6e 6f 77 6e 20 73 71 6c 69 74 65 33 5f 64 62  known sqlite3_db
316d0 5f 63 6f 6e 66 69 67 20 73 65 74 74 69 6e 67 22  _config setting"
316e0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75  , -1));.    retu
316f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
31700 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
31710 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
31720 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 29 20 29  , objv[3], &v) )
31730 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31740 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  R;.  sqlite3_db_
31750 63 6f 6e 66 69 67 28 64 62 2c 20 61 53 65 74 74  config(db, aSett
31760 69 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20 76 2c 20  ing[i].eVal, v, 
31770 26 76 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  &v);.  Tcl_SetOb
31780 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
31790 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29  Tcl_NewIntObj(v)
317a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
317b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
317c0 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77  ister commands w
317d0 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65  ith the TCL inte
317e0 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rpreter..*/.int 
317f0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
31800 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
31810 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69  erp){.  extern i
31820 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
31830 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  h_count;.  exter
31840 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f  n int sqlite3_fo
31850 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  und_count;.  ext
31860 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31870 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b  interrupt_count;
31880 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
31890 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
318a0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
318b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
318c0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
318d0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72   int sqlite3_cur
318e0 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53  rent_time;.#if S
318f0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26  QLITE_OS_UNIX &&
31900 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
31910 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
31920 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
31930 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  LE.  extern int 
31940 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
31950 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74  um;.#endif.  ext
31960 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31970 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20  max_blobsize;.  
31980 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
31990 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
319a0 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a  heReport(void*,.
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319d0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
319e0 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62  terp*,int,Tcl_Ob
319f0 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61  j*CONST*);.  sta
31a00 74 69 63 20 69 6e 74 20 69 5a 65 72 6f 20 3d 20  tic int iZero = 
31a10 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  0;.  static stru
31a20 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
31a30 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
31a40 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
31a50 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20    } aCmd[] = {. 
31a60 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72 22      { "db_enter"
31a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31a80 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31a90 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20 20  roc*)db_enter   
31aa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
31ab0 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65 22      { "db_leave"
31ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31ad0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31ae0 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20 20  roc*)db_leave   
31af0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
31b00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31b10 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
31b20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31b30 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
31b40 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20  intf_int    },. 
31b50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31b60 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20  printf_int64",  
31b70 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31b80 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
31b90 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20  intf_int64  },. 
31ba0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31bb0 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20  printf_long",   
31bc0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31bd0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
31be0 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20  intf_long   },. 
31bf0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31c00 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20  printf_str",    
31c10 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31c20 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
31c30 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20  intf_str    },. 
31c40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
31c50 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  nprintf_str",   
31c60 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31c70 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70  roc*)sqlite3_snp
31c80 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20  rintf_str   },. 
31c90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31ca0 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c  printf_stronly",
31cb0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31cc0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
31cd0 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20  intf_stronly},. 
31ce0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31cf0 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20  printf_double", 
31d00 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31d10 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
31d20 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20  intf_double },. 
31d30 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31d40 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20  printf_scaled", 
31d50 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31d60 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
31d70 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20  intf_scaled },. 
31d80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31d90 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
31da0 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f  ",   (Tcl_CmdPro
31db0 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
31dc0 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20  tf_hexdouble},. 
31dd0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
31de0 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20  printf_z_test", 
31df0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31e00 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
31e10 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_z        },.  
31e20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
31e30 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20  rintf_n_test",  
31e40 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
31e50 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66  oc*)test_mprintf
31e60 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  _n        },.   
31e70 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70    { "sqlite3_snp
31e80 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20  rintf_int",     
31e90 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
31ea0 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74 66  c*)test_snprintf
31eb0 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20  _int     },.    
31ec0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73 74   { "sqlite3_last
31ed0 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20  _insert_rowid", 
31ee0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
31ef0 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69  *)test_last_rowi
31f00 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  d       },.     
31f10 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
31f20 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
31f30 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
31f40 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74  )test_exec_print
31f50 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  f      },.     {
31f60 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68   "sqlite3_exec_h
31f70 65 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ex",            
31f80 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
31f90 74 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20 20  test_exec_hex   
31fa0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
31fb0 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c 20  "sqlite3_exec", 
31fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fd0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
31fe0 65 73 74 5f 65 78 65 63 20 20 20 20 20 20 20 20  est_exec        
31ff0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
32000 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 22  sqlite3_exec_nr"
32010 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32020 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
32030 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20 20  st_exec_nr      
32040 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
32050 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54  QLITE_OMIT_GET_T
32060 41 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  ABLE.     { "sql
32070 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70  ite3_get_table_p
32080 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63  rintf",      (Tc
32090 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
320a0 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
320b0 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
320c0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  { "sqlite3_close
320d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
320e0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
320f0 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f  )sqlite_test_clo
32100 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  se     },.     {
32110 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f   "sqlite3_close_
32120 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
32130 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
32140 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73  sqlite_test_clos
32150 65 5f 76 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20  e_v2  },.     { 
32160 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
32170 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
32180 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
32190 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  est_create_funct
321a0 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ion  },.     { "
321b0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61  sqlite3_create_a
321c0 67 67 72 65 67 61 74 65 22 2c 20 20 20 20 20 20  ggregate",      
321d0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
321e0 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  st_create_aggreg
321f0 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ate },.     { "s
32200 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
32210 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28  est_function", (
32220 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
32230 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 20  t_register_func 
32240 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
32250 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20 20 20  lite_abort",    
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
32270 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
32280 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20 20 20  te_abort        
32290 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
322a0 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20  ite_bind",      
322b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
322c0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
322d0 62 69 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  bind            
322e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61   },.     { "brea
322f0 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  kpoint",        
32300 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
32310 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62  _CmdProc*)test_b
32320 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20  reakpoint       
32330 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
32340 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20  e3_key",        
32350 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
32360 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65  CmdProc*)test_ke
32370 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  y              }
32380 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
32390 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20  3_rekey",       
323a0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
323b0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b  mdProc*)test_rek
323c0 65 79 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ey            },
323d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
323e0 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20 20 20  set_magic",     
323f0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
32400 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65  dProc*)sqlite_se
32410 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d 2c 0a  t_magic      },.
32420 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32430 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20  interrupt",     
32440 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
32450 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65 72  Proc*)test_inter
32460 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c 0a 20  rupt        },. 
32470 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65      { "sqlite_de
32480 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  lete_function", 
32490 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
324a0 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63  roc*)delete_func
324b0 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20  tion       },.  
324c0 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c     { "sqlite_del
324d0 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20  ete_collation", 
324e0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
324f0 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  oc*)delete_colla
32500 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20  tion      },.   
32510 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74    { "sqlite3_get
32520 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20  _autocommit",   
32530 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
32540 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  c*)get_autocommi
32550 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
32560 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 61 63   { "sqlite3_stac
32570 6b 5f 75 73 65 64 22 2c 20 20 20 20 20 20 20 20  k_used",        
32580 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
32590 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  *)test_stack_use
325a0 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  d       },.     
325b0 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  { "sqlite3_busy_
325c0 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
325d0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
325e0 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f  )test_busy_timeo
325f0 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ut     },.     {
32600 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20   "printf",      
32610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32620 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
32630 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20 20 20  test_printf     
32640 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
32650 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 22  "sqlite3IoTrace"
32660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
32670 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
32680 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20  t_io_trace      
32690 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 63 6c     },.     { "cl
326a0 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64  ang_sanitize_add
326b0 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 28 54  ress",        (T
326c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 63 6c 61 6e  cl_CmdProc*)clan
326d0 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
326e0 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  ss },.  };.  sta
326f0 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
32700 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
32710 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72      Tcl_ObjCmdPr
32720 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20  oc *xProc;.     
32730 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
32740 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20  ;.  } aObjCmd[] 
32750 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  = {.     { "sqli
32760 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 22 2c 20  te3_db_config", 
32770 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
32780 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66  _sqlite3_db_conf
32790 69 67 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ig, 0 },.     { 
327a0 22 62 61 64 5f 62 65 68 61 76 69 6f 72 22 2c 20  "bad_behavior", 
327b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327c0 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69   test_bad_behavi
327d0 6f 72 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a 65  or,  (void*)&iZe
327e0 72 6f 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65  ro },.     { "re
327f0 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74  gister_dbstat_vt
32800 61 62 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  ab",          te
32810 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62 73 74  st_register_dbst
32820 61 74 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20 20  at_vtab  },.    
32830 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e   { "sqlite3_conn
32840 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c  ection_pointer",
32850 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70      get_sqlite_p
32860 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20  ointer, 0 },.   
32870 20 20 7b 20 22 69 6e 74 61 72 72 61 79 5f 61 64    { "intarray_ad
32880 64 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  dr",            
32890 20 20 20 20 20 74 65 73 74 5f 69 6e 74 61 72 72       test_intarr
328a0 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20  ay_addr, 0 },.  
328b0 20 20 20 7b 20 22 69 6e 74 36 34 61 72 72 61 79     { "int64array
328c0 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20 20 20  _addr",         
328d0 20 20 20 20 20 20 74 65 73 74 5f 69 6e 74 36 34        test_int64
328e0 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c  array_addr, 0 },
328f0 0a 20 20 20 20 20 7b 20 22 64 6f 75 62 6c 65 61  .     { "doublea
32900 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20  rray_addr",     
32910 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 6f           test_do
32920 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72 2c 20  ublearray_addr, 
32930 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78  0 },.     { "tex
32940 74 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20  tarray_addr",   
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
32960 74 5f 74 65 78 74 61 72 72 61 79 5f 61 64 64 72  t_textarray_addr
32970 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
32980 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22  qlite3_bind_int"
32990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
329a0 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20  est_bind_int,   
329b0 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
329c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
329d0 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  oblob",         
329e0 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
329f0 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ob, 0 },.     { 
32a00 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65  "sqlite3_bind_ze
32a10 72 6f 62 6c 6f 62 36 34 22 2c 20 20 20 20 20 20  roblob64",      
32a20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
32a30 6c 6f 62 36 34 2c 20 30 20 7d 2c 0a 20 20 20 20  lob64, 0 },.    
32a40 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
32a50 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
32a60 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
32a70 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  t64,    0 },.   
32a80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
32a90 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  d_double",      
32aa0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64       test_bind_d
32ab0 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20  ouble,   0 },.  
32ac0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
32ad0 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20  nd_null",       
32ae0 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
32af0 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20  null     ,0 },. 
32b00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
32b10 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20  ind_text",      
32b20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
32b30 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _text     ,0 },.
32b40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32b50 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20  bind_text16",   
32b60 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
32b70 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c  d_text16   ,0 },
32b80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32b90 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20  _bind_blob",    
32ba0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
32bb0 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d  nd_blob     ,0 }
32bc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
32bd0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
32be0 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62  _count",  test_b
32bf0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
32c00 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  unt, 0},.     { 
32c10 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
32c20 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20  rameter_name",  
32c30 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
32c40 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a  eter_name,  0},.
32c50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32c60 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
32c70 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e  ndex",  test_bin
32c80 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
32c90 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  x, 0},.     { "s
32ca0 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
32cb0 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74  dings",        t
32cc0 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
32cd0 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  gs, 0},.     { "
32ce0 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20  sqlite3_sleep", 
32cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d00 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20  test_sleep,     
32d10 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
32d20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  "sqlite3_errcode
32d30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
32d40 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20   test_errcode   
32d50 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
32d60 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64   "sqlite3_extend
32d70 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20  ed_errcode",    
32d80 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64    test_ex_errcod
32d90 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  e    ,0 },.     
32da0 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
32db0 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
32dc0 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20     test_errmsg  
32dd0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
32de0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
32df0 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  sg16",          
32e00 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31      test_errmsg1
32e10 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  6      ,0 },.   
32e20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
32e30 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
32e40 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20       test_open  
32e50 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
32e60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
32e70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  en16",          
32e80 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31        test_open1
32e90 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  6        ,0 },. 
32ea0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
32eb0 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20  pen_v2",        
32ec0 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
32ed0 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  _v2       ,0 },.
32ee0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32ef0 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20  complete16",    
32f00 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d          test_com
32f10 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c  plete16    ,0 },
32f20 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
32f30 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20  3_prepare",     
32f40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
32f50 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20  repare       ,0 
32f60 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
32f70 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20  e3_prepare16",  
32f80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
32f90 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30  prepare16     ,0
32fa0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32fb0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c  te3_prepare_v2",
32fc0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
32fd0 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c  _prepare_v2    ,
32fe0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
32ff0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
33000 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65 73  3134",       tes
33010 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  t_prepare_tkt313
33020 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  4, 0},.     { "s
33030 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
33040 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74  _v2",          t
33050 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
33060 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
33070 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
33080 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33090 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20  test_finalize   
330a0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
330b0 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74  "sqlite3_stmt_st
330c0 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20  atus",          
330d0 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
330e0 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  s   ,0 },.     {
330f0 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22   "sqlite3_reset"
33100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33110 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20    test_reset    
33120 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
33130 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72  { "sqlite3_expir
33140 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ed",            
33150 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20     test_expired 
33160 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
33170 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e   { "sqlite3_tran
33180 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  sfer_bindings", 
33190 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65      test_transfe
331a0 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20  r_bind ,0 },.   
331b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61    { "sqlite3_cha
331c0 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
331d0 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65       test_change
331e0 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  s       ,0 },.  
331f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
33200 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
33210 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70 20        test_step 
33220 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
33230 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
33240 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ql",            
33250 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20         test_sql 
33260 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
33270 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33280 65 78 70 61 6e 64 65 64 5f 73 71 6c 22 2c 20 20  expanded_sql",  
33290 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f          test_ex_
332a0 73 71 6c 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  sql        ,0 },
332b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
332c0 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20  _next_stmt",    
332d0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65           test_ne
332e0 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d  xt_stmt     ,0 }
332f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33300 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22  3_stmt_readonly"
33310 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ,         test_s
33320 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20  tmt_readonly ,0 
33330 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
33340 65 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20 20  e3_stmt_busy",  
33350 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
33360 73 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c 30  stmt_busy     ,0
33370 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 73   },.     { "uses
33380 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20  _stmt_journal", 
33390 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 73              uses
333a0 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30  _stmt_journal ,0
333b0 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c   },..     { "sql
333c0 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
333d0 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73  ory",        tes
333e0 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  t_release_memory
333f0 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ,     0},.     {
33400 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c   "sqlite3_db_rel
33410 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20  ease_memory",   
33420 20 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73    test_db_releas
33430 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20  e_memory,  0},. 
33440 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64      { "sqlite3_d
33450 62 5f 63 61 63 68 65 66 6c 75 73 68 22 2c 20 20  b_cacheflush",  
33460 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 63         test_db_c
33470 61 63 68 65 66 6c 75 73 68 2c 20 20 20 20 20 20  acheflush,      
33480 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
33490 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f  te3_system_errno
334a0 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
334b0 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 2c 20 20  _system_errno,  
334c0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
334d0 22 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65  "sqlite3_db_file
334e0 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20  name",          
334f0 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d   test_db_filenam
33500 65 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  e,        0},.  
33510 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
33520 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20  _readonly",     
33530 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65        test_db_re
33540 61 64 6f 6e 6c 79 2c 20 20 20 20 20 20 20 20 30  adonly,        0
33550 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
33560 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
33570 69 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  it",       test_
33580 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c  soft_heap_limit,
33590 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
335a0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
335b0 6c 65 61 6e 75 70 22 2c 20 20 20 20 20 20 20 20  leanup",        
335c0 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61  test_thread_clea
335d0 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  nup,     0},.   
335e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 61 67    { "sqlite3_pag
335f0 65 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20 20  er_refcounts",  
33600 20 20 20 20 20 74 65 73 74 5f 70 61 67 65 72 5f       test_pager_
33610 72 65 66 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d  refcounts,    0}
33620 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
33630 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
33640 6e 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  n",        test_
33650 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20  load_extension, 
33660 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
33670 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
33680 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20  oad_extension", 
33690 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
336a0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
336b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74    { "sqlite3_ext
336c0 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
336d0 65 73 22 2c 20 74 65 73 74 5f 65 78 74 65 6e 64  es", test_extend
336e0 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c  ed_result_codes,
336f0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
33700 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20  ite3_limit",    
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
33720 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20 20 20  t_limit,        
33730 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 0a 20 20           0},..  
33740 20 20 20 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f     { "save_prng_
33750 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  state",         
33760 20 20 20 20 20 20 73 61 76 65 5f 70 72 6e 67 5f        save_prng_
33770 73 74 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20  state,    0 },. 
33780 20 20 20 20 7b 20 22 72 65 73 74 6f 72 65 5f 70      { "restore_p
33790 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20  rng_state",     
337a0 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70         restore_p
337b0 72 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c 0a  rng_state, 0 },.
337c0 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 70 72       { "reset_pr
337d0 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20  ng_state",      
337e0 20 20 20 20 20 20 20 20 72 65 73 65 74 5f 70 72          reset_pr
337f0 6e 67 5f 73 74 61 74 65 2c 20 20 20 30 20 7d 2c  ng_state,   0 },
33800 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73  .     { "databas
33810 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 22  e_never_corrupt"
33820 2c 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73  ,        databas
33830 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 2c  e_never_corrupt,
33840 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74   0},.     { "dat
33850 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72  abase_may_be_cor
33860 72 75 70 74 22 2c 20 20 20 20 20 20 20 64 61 74  rupt",       dat
33870 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72  abase_may_be_cor
33880 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  rupt, 0},.     {
33890 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63   "optimization_c
338a0 6f 6e 74 72 6f 6c 22 2c 20 20 20 20 20 20 20 20  ontrol",        
338b0 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63    optimization_c
338c0 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66 20 53  ontrol,0},.#if S
338d0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20  QLITE_OS_WIN.   
338e0 20 20 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33 32 5f    { "lock_win32_
338f0 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  file",          
33900 20 20 20 20 20 77 69 6e 33 32 5f 66 69 6c 65 5f       win32_file_
33910 6c 6f 63 6b 2c 20 20 20 20 30 20 7d 2c 0a 20 20  lock,    0 },.  
33920 20 20 20 7b 20 22 65 78 69 73 74 73 5f 77 69 6e     { "exists_win
33930 33 32 5f 70 61 74 68 22 2c 20 20 20 20 20 20 20  32_path",       
33940 20 20 20 20 20 20 77 69 6e 33 32 5f 65 78 69 73        win32_exis
33950 74 73 5f 70 61 74 68 2c 20 20 30 20 7d 2c 0a 20  ts_path,  0 },. 
33960 20 20 20 20 7b 20 22 66 69 6e 64 5f 77 69 6e 33      { "find_win3
33970 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20  2_file",        
33980 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66 69 6e         win32_fin
33990 64 5f 66 69 6c 65 2c 20 20 20 20 30 20 7d 2c 0a  d_file,    0 },.
339a0 20 20 20 20 20 7b 20 22 64 65 6c 65 74 65 5f 77       { "delete_w
339b0 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20  in32_file",     
339c0 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 64 65          win32_de
339d0 6c 65 74 65 5f 66 69 6c 65 2c 20 20 30 20 7d 2c  lete_file,  0 },
339e0 0a 20 20 20 20 20 7b 20 22 6d 61 6b 65 5f 77 69  .     { "make_wi
339f0 6e 33 32 5f 64 69 72 22 2c 20 20 20 20 20 20 20  n32_dir",       
33a00 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 6d           win32_m
33a10 6b 64 69 72 2c 20 20 20 20 20 20 20 20 30 20 7d  kdir,        0 }
33a20 2c 0a 20 20 20 20 20 7b 20 22 72 65 6d 6f 76 65  ,.     { "remove
33a30 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20 20 20  _win32_dir",    
33a40 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
33a50 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 30 20  rmdir,        0 
33a60 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
33a70 20 22 74 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20   "tcl_objproc", 
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a90 20 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20    runAsObjProc, 
33aa0 20 20 20 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20        0 },..    
33ab0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   /* sqlite3_colu
33ac0 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20  mn_*() API */.  
33ad0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
33ae0 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20  lumn_count",    
33af0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
33b00 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20  n_count  ,0 },. 
33b10 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64      { "sqlite3_d
33b20 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20  ata_count",     
33b30 20 20 20 20 20 20 20 74 65 73 74 5f 64 61 74 61         test_data
33b40 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a  _count    ,0 },.
33b50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33b60 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20  column_type",   
33b70 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
33b80 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c  umn_type   ,0 },
33b90 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33ba0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20  _column_blob",  
33bb0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
33bc0 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d  lumn_blob   ,0 }
33bd0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33be0 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22  3_column_double"
33bf0 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63  ,         test_c
33c00 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20  olumn_double ,0 
33c10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
33c20 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22  e3_column_int64"
33c30 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ,          test_
33c40 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30  column_int64  ,0
33c50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
33c60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22  te3_column_text"
33c70 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ,   test_stmt_ut
33c80 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69  f8,  (void*)sqli
33c90 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
33ca0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
33cb0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c  e3_column_name",
33cc0 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
33cd0 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  8,  (void*)sqlit
33ce0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d  e3_column_name }
33cf0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33d00 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20  3_column_int",  
33d10 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c    test_stmt_int,
33d20 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65     (void*)sqlite
33d30 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c  3_column_int  },
33d40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33d50 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20  _column_bytes", 
33d60 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
33d70 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
33d80 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a  _column_bytes},.
33d90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33da0 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20  MIT_DECLTYPE.   
33db0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
33dc0 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74 65  umn_decltype",te
33dd0 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f  st_stmt_utf8,(vo
33de0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
33df0 6d 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65  mn_decltype},.#e
33e00 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
33e10 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
33e20 5f 4d 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c  _METADATA.{ "sql
33e30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
33e40 62 61 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f  base_name",test_
33e50 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a  stmt_utf8,(void*
33e60 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
33e70 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a  database_name},.
33e80 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
33e90 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65  n_table_name",te
33ea0 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f  st_stmt_utf8,(vo
33eb0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
33ec0 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a  mn_table_name},.
33ed0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
33ee0 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74  n_origin_name",t
33ef0 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76  est_stmt_utf8,(v
33f00 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
33f10 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d  umn_origin_name}
33f20 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
33f30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
33f40 46 31 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  F16.     { "sqli
33f50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
33f60 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69  16", test_stmt_i
33f70 6e 74 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  nt, (void*)sqlit
33f80 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31  e3_column_bytes1
33f90 36 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  6 },.     { "sql
33fa0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
33fb0 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f  16",  test_stmt_
33fc0 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
33fd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
33fe0 74 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  t16},.     { "sq
33ff0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
34000 65 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74  e16",  test_stmt
34010 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
34020 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
34030 6d 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61  me16},.     { "a
34040 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
34050 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61  t_collations", a
34060 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
34070 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20  t_collations, 0 
34080 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20       },.#ifndef 
34090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
340a0 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  TYPE.     { "sql
340b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
340c0 74 79 70 65 31 36 22 2c 74 65 73 74 5f 73 74 6d  type16",test_stm
340d0 74 5f 75 74 66 31 36 2c 28 76 6f 69 64 2a 29 73  t_utf16,(void*)s
340e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
340f0 63 6c 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69  cltype16},.#endi
34100 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
34110 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
34120 54 41 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33  TADATA.{"sqlite3
34130 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
34140 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74  _name16",.  test
34150 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
34160 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
34170 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
34180 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63  16},.{"sqlite3_c
34190 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
341a0 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  16", test_stmt_u
341b0 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
341c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
341d0 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c  e_name16},.{"sql
341e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
341f0 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74  in_name16", test
34200 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
34210 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
34220 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36  mn_origin_name16
34230 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  },.#endif.#endif
34240 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34250 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
34260 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61  n_v2", test_crea
34270 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c  te_collation_v2,
34280 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
34290 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
342a0 6f 76 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f  over",     test_
342b0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20  global_recover, 
342c0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77  0   },.     { "w
342d0 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
342e0 22 2c 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b  ",          work
342f0 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20  ing_64bit_int,  
34300 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
34310 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22  vfs_unlink_test"
34320 2c 20 20 20 20 20 20 20 20 20 20 20 20 76 66 73  ,            vfs
34330 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20  _unlink_test,   
34340 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
34350 22 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65  "vfs_initfail_te
34360 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 76 66  st",          vf
34370 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 2c  s_initfail_test,
34380 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
34390 20 22 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72   "vfs_unregister
343a0 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76  _all",         v
343b0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c  fs_unregister_al
343c0 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  l,  0   },.     
343d0 7b 20 22 76 66 73 5f 72 65 72 65 67 69 73 74 65  { "vfs_reregiste
343e0 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  r_all",         
343f0 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61  vfs_reregister_a
34400 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  ll,  0   },.    
34410 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
34420 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
34430 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
34440 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  st,   0   },.   
34450 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
34460 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74  l_lasterrno_test
34470 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
34480 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 2c 20  lasterrno_test, 
34490 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
344a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
344b0 6b 70 72 6f 78 79 5f 74 65 73 74 22 2c 20 66 69  kproxy_test", fi
344c0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70  le_control_lockp
344d0 72 6f 78 79 5f 74 65 73 74 2c 20 20 30 20 20 20  roxy_test,  0   
344e0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
344f0 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a  control_chunksiz
34500 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  e_test", file_co
34510 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
34520 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20  test,  0   },.  
34530 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
34540 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74  ol_sizehint_test
34550 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ",  file_control
34560 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c 20  _sizehint_test, 
34570 20 20 30 20 20 20 7d 2c 0a 23 69 66 20 53 51 4c    0   },.#if SQL
34580 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20  ITE_OS_WIN.     
34590 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
345a0 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 22 2c  win32_av_retry",
345b0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
345c0 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20 20 30  n32_av_retry,  0
345d0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
345e0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
345f0 5f 73 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66 69  _set_handle", fi
34600 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
34610 5f 73 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20 20  _set_handle, 0  
34620 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
34630 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70   "file_control_p
34640 65 72 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20  ersist_wal",    
34650 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
34660 73 69 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20  sist_wal,     0 
34670 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
34680 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73  e_control_powers
34690 61 66 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66  afe_overwrite",f
346a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65  ile_control_powe
346b0 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c  rsafe_overwrite,
346c0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65  0},.     { "file
346d0 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65  _control_vfsname
346e0 22 2c 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63  ",        file_c
346f0 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20  ontrol_vfsname, 
34700 20 20 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20          0   },. 
34710 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
34720 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
34730 22 2c 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  ",   file_contro
34740 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c 20  l_tempfilename, 
34750 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
34760 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69   "sqlite3_vfs_li
34770 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 76  st",           v
34780 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20  fs_list,     0  
34790 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
347a0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
347b0 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72  ion_v2", test_cr
347c0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
347d0 2c 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20  , 0 },..     /* 
347e0 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f  Functions from o
347f0 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  s.h */.#ifndef S
34800 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
34810 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73  .     { "add_tes
34820 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20  t_collate",     
34830 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c     test_collate,
34840 20 30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c   0            },
34850 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73  .     { "add_tes
34860 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
34870 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  ", test_collate_
34880 6e 65 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c  needed, 0     },
34890 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73  .     { "add_tes
348a0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  t_function",    
348b0 20 20 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e     test_function
348c0 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c  , 0           },
348d0 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73  .     { "add_tes
348e0 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
348f0 74 65 22 2c 20 20 20 20 74 65 73 74 5f 75 74 66  te",    test_utf
34900 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 2c 20 30  16bin_collate, 0
34910 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69          },.#endi
34920 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
34930 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20  3_test_errstr", 
34940 20 20 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c      test_errstr,
34950 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d   0             }
34960 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61  ,.     { "tcl_va
34970 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20  riable_type",   
34980 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65      tcl_variable
34990 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d  _type, 0       }
349a0 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
349b0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
349c0 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  HE.     { "sqlit
349d0 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
349e0 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e  _cache", test_en
349f0 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20  able_shared, 0  
34a00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34a10 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f  e3_shared_cache_
34a20 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33  report", sqlite3
34a30 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65  BtreeSharedCache
34a40 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64  Report, 0},.#end
34a50 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
34a60 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
34a70 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76  mber", test_libv
34a80 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30  ersion_number, 0
34a90 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
34aa0 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
34ab0 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73  n_metadata", tes
34ac0 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  t_table_column_m
34ad0 65 74 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23  etadata, 0  },.#
34ae0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34af0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
34b00 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62   { "sqlite3_blob
34b10 5f 72 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f 62  _reopen", test_b
34b20 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20 7d  lob_reopen, 0  }
34b30 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
34b40 22 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20  "pcache_stats", 
34b50 20 20 20 20 20 20 74 65 73 74 5f 70 63 61 63 68        test_pcach
34b60 65 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23  e_stats, 0  },.#
34b70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
34b80 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
34b90 59 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  Y.     { "sqlite
34ba0 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22  3_unlock_notify"
34bb0 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  , test_unlock_no
34bc0 74 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64  tify, 0  },.#end
34bd0 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
34be0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
34bf0 74 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f 63  t",   test_wal_c
34c00 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c  heckpoint, 0  },
34c10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34c20 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
34c30 76 32 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65  v2",test_wal_che
34c40 63 6b 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d  ckpoint_v2, 0  }
34c50 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34c60 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
34c70 6f 69 6e 74 22 2c 74 65 73 74 5f 77 61 6c 5f 61  oint",test_wal_a
34c80 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30  utocheckpoint, 0
34c90 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73    },.     { "tes
34ca0 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20  t_sqlite3_log", 
34cb0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c          test_sql
34cc0 69 74 65 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a  ite3_log, 0  },.
34cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34ce0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20  MIT_EXPLAIN.    
34cf0 20 7b 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69   { "print_explai
34d00 6e 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74  n_query_plan", t
34d10 65 73 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30  est_print_eqp, 0
34d20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
34d30 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74   { "sqlite3_test
34d40 5f 63 6f 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f  _control", test_
34d50 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a  test_control },.
34d60 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
34d70 49 58 0a 20 20 20 20 20 7b 20 22 67 65 74 72 75  IX.     { "getru
34d80 73 61 67 65 22 2c 20 74 65 73 74 5f 67 65 74 72  sage", test_getr
34d90 75 73 61 67 65 20 7d 2c 0a 23 65 6e 64 69 66 0a  usage },.#endif.
34da0 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f 73 74 61       { "load_sta
34db0 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20  tic_extension", 
34dc0 74 63 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74  tclLoadStaticExt
34dd0 65 6e 73 69 6f 6e 43 6d 64 20 7d 2c 0a 20 20 20  ensionCmd },.   
34de0 20 20 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74    { "sorter_test
34df0 5f 66 61 6b 65 68 65 61 70 22 2c 20 73 6f 72 74  _fakeheap", sort
34e00 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70  er_test_fakeheap
34e10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74   },.     { "sort
34e20 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65  er_test_sort4_he
34e30 6c 70 65 72 22 2c 20 73 6f 72 74 65 72 5f 74 65  lper", sorter_te
34e40 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20  st_sort4_helper 
34e50 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
34e60 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
34e70 54 49 4f 4e 0a 20 20 20 20 20 7b 20 22 73 71 6c  TION.     { "sql
34e80 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e  ite3_user_authen
34e90 74 69 63 61 74 65 22 2c 20 74 65 73 74 5f 75 73  ticate", test_us
34ea0 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 2c  er_authenticate,
34eb0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
34ec0 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 22 2c  lite3_user_add",
34ed0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 75            test_u
34ee0 73 65 72 5f 61 64 64 2c 20 20 20 20 20 20 20 20  ser_add,        
34ef0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73    0 },.     { "s
34f00 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e  qlite3_user_chan
34f10 67 65 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ge",       test_
34f20 75 73 65 72 5f 63 68 61 6e 67 65 2c 20 20 20 20  user_change,    
34f30 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
34f40 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c  sqlite3_user_del
34f50 65 74 65 22 2c 20 20 20 20 20 20 20 74 65 73 74  ete",       test
34f60 5f 75 73 65 72 5f 64 65 6c 65 74 65 2c 20 20 20  _user_delete,   
34f70 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
34f80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
34f90 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
34fa0 41 54 55 53 0a 20 20 20 20 20 7b 20 22 73 71 6c  ATUS.     { "sql
34fb0 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
34fc0 61 74 75 73 22 2c 20 20 20 20 20 20 20 74 65 73  atus",       tes
34fd0 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  t_stmt_scanstatu
34fe0 73 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  s,   0 },.     {
34ff0 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73   "sqlite3_stmt_s
35000 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 22  canstatus_reset"
35010 2c 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e  , test_stmt_scan
35020 73 74 61 74 75 73 5f 72 65 73 65 74 2c 20 20 20  status_reset,   
35030 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  0 },.#endif.#ifd
35040 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35050 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 20 7b 20 22  _SQLLOG.     { "
35060 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73  sqlite3_config_s
35070 71 6c 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20  qllog",         
35080 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c  test_config_sqll
35090 6f 67 2c 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69  og,   0 },.#endi
350a0 66 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 63 75  f.     { "vfs_cu
350b0 72 72 65 6e 74 5f 74 69 6d 65 5f 69 6e 74 36 34  rrent_time_int64
350c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 76 66 73  ",           vfs
350d0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
350e0 2c 20 20 20 30 20 7d 2c 0a 23 69 66 64 65 66 20  ,   0 },.#ifdef 
350f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
35100 41 50 53 48 4f 54 0a 20 20 20 20 20 7b 20 22 73  APSHOT.     { "s
35110 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
35120 67 65 74 22 2c 20 74 65 73 74 5f 73 6e 61 70 73  get", test_snaps
35130 68 6f 74 5f 67 65 74 2c 20 30 20 7d 2c 0a 20 20  hot_get, 0 },.  
35140 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
35150 61 70 73 68 6f 74 5f 6f 70 65 6e 22 2c 20 74 65  apshot_open", te
35160 73 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e  st_snapshot_open
35170 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
35180 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
35190 66 72 65 65 22 2c 20 74 65 73 74 5f 73 6e 61 70  free", test_snap
351a0 73 68 6f 74 5f 66 72 65 65 2c 20 30 20 7d 2c 0a  shot_free, 0 },.
351b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
351c0 73 6e 61 70 73 68 6f 74 5f 63 6d 70 22 2c 20 74  snapshot_cmp", t
351d0 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70  est_snapshot_cmp
351e0 2c 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  , 0 },.#endif.  
351f0 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  };.  static int 
35200 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73  bitmask_size = s
35210 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
35220 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6c  ;.  static int l
35230 6f 6e 67 64 6f 75 62 6c 65 5f 73 69 7a 65 20 3d  ongdouble_size =
35240 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
35250 4c 45 5f 54 59 50 45 29 3b 0a 20 20 69 6e 74 20  LE_TYPE);.  int 
35260 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  i;.  extern int 
35270 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
35280 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  nt, sqlite3_full
35290 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  sync_count;.  ex
352a0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
352b0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b  _opentemp_count;
352c0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
352d0 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
352e0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
352f0 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
35300 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
35310 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
35320 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20  _readdb_count;. 
35330 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
35340 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
35350 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  b_count;.  exter
35360 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  n int sqlite3_pa
35370 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
35380 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
35390 57 49 4e 0a 20 20 65 78 74 65 72 6e 20 4c 4f 4e  WIN.  extern LON
353a0 47 20 76 6f 6c 61 74 69 6c 65 20 73 71 6c 69 74  G volatile sqlit
353b0 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23 65 6e 64  e3_os_type;.#end
353c0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
353d0 5f 44 45 42 55 47 0a 20 20 65 78 74 65 72 6e 20  _DEBUG.  extern 
353e0 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
353f0 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20  Trace;.  extern 
35400 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72 61  int sqlite3OSTra
35410 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  ce;.  extern int
35420 20 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65   sqlite3WalTrace
35430 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
35440 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 69 66 64  SQLITE_TEST.#ifd
35450 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35460 5f 46 54 53 33 0a 20 20 65 78 74 65 72 6e 20 69  _FTS3.  extern i
35470 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f  nt sqlite3_fts3_
35480 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
35490 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  es;.#endif.#endi
354a0 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  f..  for(i=0; i<
354b0 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a  sizeof(aCmd)/siz
354c0 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b  eof(aCmd[0]); i+
354d0 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
354e0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
354f0 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  , aCmd[i].zName,
35500 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20   aCmd[i].xProc, 
35510 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  0, 0);.  }.  for
35520 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
35530 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  ObjCmd)/sizeof(a
35540 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  ObjCmd[0]); i++)
35550 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
35560 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
35570 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e  p, aObjCmd[i].zN
35580 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f  ame, .        aO
35590 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20  bjCmd[i].xProc, 
355a0 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e  aObjCmd[i].clien
355b0 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20  tData, 0);.  }. 
355c0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
355d0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61  erp, "sqlite_sea
355e0 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  rch_count", .   
355f0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
35600 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c  e3_search_count,
35610 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
35620 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
35630 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 6f  terp, "sqlite_fo
35640 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  und_count", .   
35650 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
35660 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2c 20  e3_found_count, 
35670 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
35680 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
35690 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72  erp, "sqlite_sor
356a0 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  t_count", .     
356b0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
356c0 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  _sort_count, TCL
356d0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
356e0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
356f0 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62  , "sqlite3_max_b
35700 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20 20 20  lobsize", .     
35710 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
35720 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c 20 54  _max_blobsize, T
35730 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
35740 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
35750 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69 6b 65  rp, "sqlite_like
35760 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
35770 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
35780 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  like_count, TCL_
35790 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
357a0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
357b0 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75   "sqlite_interru
357c0 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  pt_count", .    
357d0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
357e0 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
357f0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
35800 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
35810 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
35820 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22  open_file_count"
35830 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
35840 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69  &sqlite3_open_fi
35850 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  le_count, TCL_LI
35860 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
35870 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
35880 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74  sqlite_current_t
35890 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68  ime", .      (ch
358a0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75 72  ar*)&sqlite3_cur
358b0 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c  rent_time, TCL_L
358c0 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 53 51  INK_INT);.#if SQ
358d0 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20  LITE_OS_UNIX && 
358e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
358f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
35900 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
35910 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  E.  Tcl_LinkVar(
35920 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
35930 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20 0a 20 20  hostid_num", .  
35940 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
35950 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 2c 20  te3_hostid_num, 
35960 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
35970 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b  endif.  Tcl_Link
35980 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
35990 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite3_xferopt_cou
359a0 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
359b0 2a 29 26 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  *)&sqlite3_xfero
359c0 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  pt_count, TCL_LI
359d0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
359e0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
359f0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
35a00 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  addb_count",.   
35a10 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
35a20 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
35a30 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
35a40 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
35a50 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
35a60 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
35a70 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  db_count",.     
35a80 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
35a90 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
35aa0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
35ab0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
35ac0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
35ad0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
35ae0 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
35af0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70  char*)&sqlite3_p
35b00 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
35b10 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
35b20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
35b30 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63  _OMIT_UTF16.  Tc
35b40 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
35b50 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72  , "unaligned_str
35b60 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c 0a 20 20  ing_counter",.  
35b70 20 20 20 20 28 63 68 61 72 2a 29 26 75 6e 61 6c      (char*)&unal
35b80 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
35b90 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  nter, TCL_LINK_I
35ba0 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  NT);.#endif.#ifn
35bb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35bc0 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b  UTF16.  Tcl_Link
35bd0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
35be0 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64 65 64 5f  ite_last_needed_
35bf0 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20 20 20  collation",.    
35c00 20 20 28 63 68 61 72 2a 29 26 70 7a 4e 65 65 64    (char*)&pzNeed
35c10 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c  edCollation, TCL
35c20 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c  _LINK_STRING|TCL
35c30 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
35c40 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
35c50 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 54 63 6c  ITE_OS_WIN.  Tcl
35c60 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
35c70 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79 70 65   "sqlite_os_type
35c80 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
35c90 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
35ca0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 4c 4f 4e 47 29  , TCL_LINK_LONG)
35cb0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
35cc0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
35cd0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
35ce0 20 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c 61   char *query_pla
35cf0 6e 20 3d 20 22 2a 2a 2a 20 4f 42 53 4f 4c 45 54  n = "*** OBSOLET
35d00 45 20 56 41 52 49 41 42 4c 45 20 2a 2a 2a 22 3b  E VARIABLE ***";
35d10 0a 20 20 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  .    Tcl_LinkVar
35d20 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
35d30 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 0a 20 20  _query_plan",.  
35d40 20 20 20 20 20 28 63 68 61 72 2a 29 26 71 75 65       (char*)&que
35d50 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e  ry_plan, TCL_LIN
35d60 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e  K_STRING|TCL_LIN
35d70 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20  K_READ_ONLY);.  
35d80 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
35d90 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54  SQLITE_DEBUG.  T
35da0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
35db0 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65 72 65  p, "sqlite_where
35dc0 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
35dd0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57 68  char*)&sqlite3Wh
35de0 65 72 65 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  ereTrace, TCL_LI
35df0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
35e00 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
35e10 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22  sqlite_os_trace"
35e20 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
35e30 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 2c 20  sqlite3OSTrace, 
35e40 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
35e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35e60 49 54 5f 57 41 4c 0a 20 20 54 63 6c 5f 4c 69 6e  IT_WAL.  Tcl_Lin
35e70 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
35e80 6c 69 74 65 5f 77 61 6c 5f 74 72 61 63 65 22 2c  lite_wal_trace",
35e90 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
35ea0 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 2c 20  qlite3WalTrace, 
35eb0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
35ec0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
35ed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35ee0 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69  _DISKIO.  Tcl_Li
35ef0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
35f00 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63  qlite_opentemp_c
35f10 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
35f20 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
35f30 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c  ntemp_count, TCL
35f40 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
35f50 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  if.  Tcl_LinkVar
35f60 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
35f70 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
35f80 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
35f90 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
35fa0 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
35fb0 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
35fc0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
35fd0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  erp, "sqlite_sta
35fe0 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c  tic_bind_nbyte",
35ff0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
36000 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
36010 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e  d_nbyte, TCL_LIN
36020 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
36030 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
36040 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63  qlite_temp_direc
36050 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68  tory",.      (ch
36060 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d  ar*)&sqlite3_tem
36070 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  p_directory, TCL
36080 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
36090 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
360a0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 64 61 74  erp, "sqlite_dat
360b0 61 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20  a_directory",.  
360c0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
360d0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
360e0 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  ry, TCL_LINK_STR
360f0 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  ING);.  Tcl_Link
36100 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74  Var(interp, "bit
36110 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20  mask_size",.    
36120 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73    (char*)&bitmas
36130 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  k_size, TCL_LINK
36140 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  _INT|TCL_LINK_RE
36150 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f  AD_ONLY);.  Tcl_
36160 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
36170 22 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73 69 7a 65  "longdouble_size
36180 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
36190 26 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73 69 7a 65  &longdouble_size
361a0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54  , TCL_LINK_INT|T
361b0 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
361c0 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  Y);.  Tcl_LinkVa
361d0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
361e0 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20  e_sync_count",. 
361f0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
36200 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c  ite3_sync_count,
36210 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
36220 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
36230 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75  terp, "sqlite_fu
36240 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20  llsync_count",. 
36250 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
36260 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
36270 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
36280 54 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  T);.#if defined(
36290 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
362a0 53 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  S3) && defined(S
362b0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 54 63  QLITE_TEST).  Tc
362c0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
362d0 2c 20 22 73 71 6c 69 74 65 5f 66 74 73 33 5f 65  , "sqlite_fts3_e
362e0 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
362f0 73 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  s",.      (char*
36300 29 26 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65  )&sqlite3_fts3_e
36310 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
36320 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  s, TCL_LINK_INT)
36330 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
36340 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a              n TCL_OK;.}.