/ Hex Artifact Content
Login

Artifact 640f862c490c8eee09a9d02d0d128c6a8a75336d:


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 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  idx;.  int bytes
192c0 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b  ;.  char *value;
192d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
192e0 69 74 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f  ite3_destructor_
192f0 74 79 70 65 20 78 44 65 73 74 72 75 63 74 6f 72  type xDestructor
19300 20 3d 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49   = SQLITE_TRANSI
19310 45 4e 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ENT;..  if( objc
19320 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29  !=5 && objc!=6 )
19330 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
19340 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
19350 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
19360 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
19370 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
19380 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
19390 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
193a0 44 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b  DATA BYTES", 0);
193b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
193c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
193d0 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20  ( objc==6 ){.   
193e0 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53   xDestructor = S
193f0 51 4c 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20  QLITE_STATIC;.  
19400 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20    objv++;.  }.. 
19410 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19420 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19430 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19440 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19450 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19460 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
19470 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19480 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
19490 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
194a0 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c  R;.  value = Tcl
194b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
194c0 33 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  3]);.  if( Tcl_G
194d0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
194e0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62  erp, objv[4], &b
194f0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
19500 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
19510 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62  = sqlite3_bind_b
19520 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  lob(pStmt, idx, 
19530 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44  value, bytes, xD
19540 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66  estructor);.  if
19550 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
19560 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
19570 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
19580 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19590 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
195a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
195b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
195c0 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
195d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
195e0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
195f0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
19600 72 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a  r_count  STMT.**
19610 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19620 75 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72  umber of wildcar
19630 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  ds in the given 
19640 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
19650 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
19660 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
19670 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
19680 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19690 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
196a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
196b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
196c0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
196d0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
196e0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
196f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
19700 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
19710 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
19720 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19730 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
19740 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
19750 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19760 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
19770 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
19780 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
19790 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
197a0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
197b0 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  j(sqlite3_bind_p
197c0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
197d0 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
197e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
197f0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
19800 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
19810 65 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e  er_name  STMT  N
19820 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
19830 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74  e name of the Nt
19840 68 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  h wildcard.  The
19850 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20   first wildcard 
19860 69 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74  is 1..** An empt
19870 79 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  y string is retu
19880 72 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74  rned if N is out
19890 20 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20   of range or if 
198a0 74 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  the wildcard.** 
198b0 69 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a  is nameless..*/.
198c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
198d0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
198e0 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ame(.  void * cl
198f0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19900 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19910 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19920 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19930 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19940 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
19950 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62  int i;..  if( ob
19960 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
19970 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
19980 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
19990 53 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65  STMT N");.    re
199a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
199b0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
199c0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
199d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
199e0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
199f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19a00 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
19a10 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19a20 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
19a30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19a40 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
19a50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
19a60 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74   .     Tcl_NewSt
19a70 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
19a80 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
19a90 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29  ame(pStmt,i),-1)
19aa0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
19ab0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19ac0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
19ad0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
19ae0 69 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d  index  STMT  NAM
19af0 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
19b00 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
19b10 77 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20  wildcard called 
19b20 4e 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20  NAME.  Return 0 
19b30 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
19b40 6f 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e  o such wildcard.
19b50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19b60 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
19b70 65 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64  er_index(.  void
19b80 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19b90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19ba0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19bb0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19bc0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19bd0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19be0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
19bf0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
19c00 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
19c10 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
19c20 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74   NAME");.    ret
19c30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19c40 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
19c50 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19c60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19c70 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
19c80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19c90 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
19ca0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
19cb0 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
19cc0 62 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74  bj(.       sqlit
19cd0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
19ce0 72 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63  r_index(pStmt,Tc
19cf0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19d00 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29  [2])).     ).  )
19d10 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
19d20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
19d30 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65  e:   sqlite3_cle
19d40 61 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54  ar_bindings STMT
19d50 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
19d60 74 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e  t test_clear_bin
19d70 64 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20  dings(.  void * 
19d80 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19d90 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19da0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19db0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19dc0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19dd0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
19de0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
19df0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
19e00 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
19e10 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
19e20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19e30 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19e40 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
19e50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19e60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19e70 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
19e80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
19e90 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
19ea0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
19eb0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65  tObj(sqlite3_cle
19ec0 61 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d  ar_bindings(pStm
19ed0 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
19ee0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19ef0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
19f00 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f  _sleep MILLISECO
19f10 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NDS.*/.static in
19f20 74 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20  t test_sleep(.  
19f30 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
19f40 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
19f50 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19f60 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19f70 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19f80 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28    int ms;..  if(
19f90 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
19fa0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
19fb0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
19fc0 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  , "MILLISECONDS"
19fd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19fe0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
19ff0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1a000 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1a010 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20  v[1], &ms) ){.  
1a020 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a030 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  OR;.  }.  Tcl_Se
1a040 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1a050 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1a060 28 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d  (sqlite3_sleep(m
1a070 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  s)));.  return T
1a080 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a090 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
1a0a0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20  xtended_errcode 
1a0b0 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
1a0c0 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
1a0d0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1a0e0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1a0f0 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72  ite3_* API.** er
1a100 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22  ror code. e.g. "
1a110 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a  SQLITE_ERROR"..*
1a120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1a130 74 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20  t_ex_errcode(.  
1a140 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a150 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a160 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1a170 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1a180 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1a190 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a1a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1a1b0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1a1c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a1d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a1e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a1f0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1a200 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a210 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
1a220 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a230 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1a240 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1a250 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1a260 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1a270 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a280 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1a290 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1a2a0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63  rrcode(db);.  Tc
1a2b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a2c0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1a2d0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1a2e0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1a2f0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
1a300 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72  sage: sqlite3_er
1a310 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
1a320 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
1a330 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1a340 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1a350 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
1a360 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
1a370 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
1a380 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
1a390 6e 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28  nt test_errcode(
1a3a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1a3b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1a3c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1a3d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1a3e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1a3f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1a400 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1a410 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1a420 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a430 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1a440 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1a450 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1a460 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1a470 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
1a480 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a490 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a4a0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1a4b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1a4c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1a4d0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1a4e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1a4f0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1a500 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  (db);.  Tcl_Appe
1a510 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a520 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1a530 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1a540 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a550 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1a560 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20   sqlite3_errmsg 
1a570 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
1a580 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65   the UTF-8 repre
1a590 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1a5a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
1a5b0 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
1a5c0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1a5d0 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
1a5e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a5f0 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f  est_errmsg(.  vo
1a600 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1a610 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1a620 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1a630 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1a640 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1a650 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1a660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
1a670 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1a680 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1a690 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a6a0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1a6b0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1a6c0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1a6d0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1a6e0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1a6f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a700 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1a710 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1a720 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a730 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1a740 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1a750 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
1a760 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54  _errmsg(db);.  T
1a770 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1a780 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
1a790 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d  tringObj(zErr, -
1a7a0 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
1a7b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1a7c0 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72  sage:   test_err
1a7d0 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52  msg16 DB.**.** R
1a7e0 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31  eturns the UTF-1
1a7f0 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  6 representation
1a800 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
1a810 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
1a820 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
1a830 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
1a840 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20  I call. This is 
1a850 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a  a byte array obj
1a860 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a  ect at the TCL .
1a870 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74  ** level, and it
1a880 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78   includes the 0x
1a890 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  00 0x00 terminat
1a8a0 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20  or bytes at the 
1a8b0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54  end of the.** UT
1a8c0 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  F-16 string..*/.
1a8d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a8e0 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64  errmsg16(.  void
1a8f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1a900 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a910 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1a920 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1a930 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1a940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a950 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
1a960 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
1a970 64 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74  d *zErr;.  const
1a980 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
1a990 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66  bytes = 0;..  if
1a9a0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1a9b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a9c0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a9d0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a9e0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1a9f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1aa00 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
1aa10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1aa20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1aa30 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1aa40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1aa50 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1aa60 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1aa70 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72  L_ERROR;..  zErr
1aa80 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   = sqlite3_errms
1aa90 67 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a  g16(db);.  if( z
1aaa0 45 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a  Err ){.    z = z
1aab0 45 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74  Err;.    for(byt
1aac0 65 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c  es=0; z[bytes] |
1aad0 7c 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79  | z[bytes+1]; by
1aae0 74 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20  tes+=2){}.  }.  
1aaf0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1ab00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1ab10 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72  ByteArrayObj(zEr
1ab20 72 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64  r, bytes));.#end
1ab30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1ab40 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1ab50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ab60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1ab70 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73  te3_prepare DB s
1ab80 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1ab90 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  r?.**.** Compile
1aba0 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1abb0 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1abc0 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1abd0 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1abe0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1abf0 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1ac00 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1ac10 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1ac20 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1ac30 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1ac40 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1ac50 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1ac60 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1ac70 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1ac80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ac90 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a  t test_prepare(.
1aca0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1acb0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1acc0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1acd0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1ace0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1acf0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1ad00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ad10 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
1ad20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1ad30 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
1ad40 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ad50 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
1ad60 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
1ad70 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1ad80 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
1ad90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ada0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1adb0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1adc0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1add0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ade0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1adf0 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1ae00 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
1ae10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ae20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1ae30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1ae40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ae50 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1ae60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ae70 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
1ae80 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
1ae90 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1aea0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1aeb0 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
1aec0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1aed0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
1aee0 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
1aef0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1af00 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1af10 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63  zTail : 0);.  Tc
1af20 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
1af30 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c  terp);.  if( sql
1af40 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1af50 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1af60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1af70 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20  OR;.  if( zTail 
1af80 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  && objc>=5 ){.  
1af90 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
1afa0 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
1afb0 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54  bytes - (int)(zT
1afc0 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ail-zSql);.    }
1afd0 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 73 74  .    if( (int)st
1afe0 72 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65  rlen(zTail)<byte
1aff0 73 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  s ){.      bytes
1b000 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
1b010 54 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Tail);.    }.   
1b020 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1b030 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1b040 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
1b050 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
1b060 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
1b070 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b080 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b090 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
1b0a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1b0b0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
1b0c0 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
1b0d0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1b0e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1b0f0 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
1b100 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
1b110 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b120 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
1b130 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1b140 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1b150 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1b160 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1b170 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b180 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1b190 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1b1a0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
1b1b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b1c0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b1d0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1b1e0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
1b1f0 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f  ailvar?.**.** Co
1b200 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
1b210 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
1b220 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
1b230 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
1b240 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
1b250 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
1b260 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
1b270 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
1b280 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
1b290 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
1b2a0 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
1b2b0 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
1b2c0 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
1b2d0 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
1b2e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1b2f0 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
1b300 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  are_v2(.  void *
1b310 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b320 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b330 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b340 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b350 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1b360 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
1b370 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
1b380 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30 3b 20  har *zCopy = 0; 
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b3a0 2a 20 6d 61 6c 6c 6f 63 28 29 20 63 6f 70 79 20  * malloc() copy 
1b3b0 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e 74  of zSql */.  int
1b3c0 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20   bytes;.  const 
1b3d0 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  char *zTail = 0;
1b3e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1b3f0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1b400 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
1b410 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
1b420 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
1b430 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b440 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b450 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b460 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1b470 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1b480 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1b490 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
1b4a0 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
1b4b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b4c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1b4d0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1b4e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b4f0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1b500 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b510 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1b520 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
1b530 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
1b540 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1b550 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
1b560 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
1b570 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e  _ERROR;..  /* In
1b580 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 7a  stead of using z
1b590 53 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d 61  Sql directly, ma
1b5a0 6b 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20 61  ke a copy into a
1b5b0 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64   buffer obtained
1b5c0 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 66  .  ** directly f
1b5d0 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68  rom malloc(). Th
1b5e0 65 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61 6b  e idea is to mak
1b5f0 65 20 69 74 20 65 61 73 69 65 72 20 66 6f 72 20  e it easier for 
1b600 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f  valgrind.  ** to
1b610 20 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76 65   spot buffer ove
1b620 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66  rreads.  */.  if
1b630 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
1b640 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63    zCopy = malloc
1b650 28 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d  (bytes);.    mem
1b660 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c  cpy(zCopy, zSql,
1b670 20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65   bytes);.  }else
1b680 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69  {.    int n = (i
1b690 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20  nt)strlen(zSql) 
1b6a0 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d  + 1;.    zCopy =
1b6b0 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20   malloc(n);.    
1b6c0 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53  memcpy(zCopy, zS
1b6d0 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 63  ql, n);.  }.  rc
1b6e0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1b6f0 72 65 5f 76 32 28 64 62 2c 20 7a 43 6f 70 79 2c  re_v2(db, zCopy,
1b700 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
1b710 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1b720 20 3a 20 30 29 3b 0a 20 20 66 72 65 65 28 7a 43   : 0);.  free(zC
1b730 6f 70 79 29 3b 0a 20 20 7a 54 61 69 6c 20 3d 20  opy);.  zTail = 
1b740 26 7a 53 71 6c 5b 28 7a 54 61 69 6c 20 2d 20 7a  &zSql[(zTail - z
1b750 43 6f 70 79 29 5d 3b 0a 0a 20 20 61 73 73 65 72  Copy)];..  asser
1b760 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
1b770 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20  || pStmt==0);.  
1b780 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1b790 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73  interp);.  if( s
1b7a0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1b7b0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1b7c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b7d0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d  RROR;.  if( rc==
1b7e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 54 61  SQLITE_OK && zTa
1b7f0 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b  il && objc>=5 ){
1b800 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d  .    if( bytes>=
1b810 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  0 ){.      bytes
1b820 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29   = bytes - (int)
1b830 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20  (zTail-zSql);.  
1b840 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53    }.    Tcl_ObjS
1b850 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
1b860 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e  bjv[4], 0, Tcl_N
1b870 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69  ewStringObj(zTai
1b880 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20  l, bytes), 0);. 
1b890 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1b8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1b8b0 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
1b8c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
1b8d0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
1b8e0 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29  uf), zBuf, "(%d)
1b8f0 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
1b900 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b910 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
1b920 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
1b930 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b940 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b950 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1b960 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1b970 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1b980 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1b990 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1b9a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
1b9b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b9c0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1b9d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1b9e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1b9f0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
1ba00 70 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42 0a  pare_tkt3134 DB.
1ba10 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  **.** Generate a
1ba20 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1ba30 65 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62  ent for a zero-b
1ba40 79 74 65 20 73 74 72 69 6e 67 20 61 73 20 61 20  yte string as a 
1ba50 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b  test.** for tick
1ba60 65 74 20 23 33 31 33 34 2e 20 20 54 68 65 20 73  et #3134.  The s
1ba70 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  tring should be 
1ba80 70 72 65 63 65 64 65 64 20 62 79 20 61 20 7a 65  preceded by a ze
1ba90 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  ro byte..*/.stat
1baa0 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
1bab0 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20 76  are_tkt3134(.  v
1bac0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1bad0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1bae0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1baf0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1bb00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1bb10 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1bb20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1bb30 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30  r zSql[] = "\000
1bb40 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71 6c  SELECT 1";.  sql
1bb50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1bb60 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
1bb70 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
1bb80 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1bb90 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1bba0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bbb0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1bbc0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1bbd0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1bbe0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1bbf0 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
1bc00 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72  lvar", 0);.    r
1bc10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bc20 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1bc30 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1bc40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bc50 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1bc60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bc70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1bc80 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 26  prepare_v2(db, &
1bc90 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74  zSql[1], 0, &pSt
1bca0 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  mt, 0);.  assert
1bcb0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
1bcc0 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69  | pStmt==0);.  i
1bcd0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1bce0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
1bcf0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
1bd00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1bd10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bd20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1bd30 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  mt==0 );.    sql
1bd40 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1bd50 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
1bd60 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
1bd70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1bd80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1bd90 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
1bda0 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
1bdb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bdc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1bdd0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1bde0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1bdf0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1be00 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1be10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1be20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1be30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1be40 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
1be50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1be60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1be70 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44 42  te3_prepare16 DB
1be80 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
1be90 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  ar.**.** Compile
1bea0 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1beb0 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1bec0 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1bed0 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1bee0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1bef0 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1bf00 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1bf10 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1bf20 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1bf30 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1bf40 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1bf50 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1bf60 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1bf70 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1bf80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1bf90 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36  t test_prepare16
1bfa0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1bfb0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1bfc0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1bfd0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1bfe0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1bff0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1c000 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1c010 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1c020 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
1c030 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1c040 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
1c050 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
1c060 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c070 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1c080 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
1c090 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
1c0a0 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1c0b0 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1c0c0 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
1c0d0 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
1c0e0 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
1c0f0 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
1c100 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
1c110 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
1c120 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1c130 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1c140 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c150 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c160 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c170 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c180 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c190 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1c1a0 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
1c1b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c1c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1c1d0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1c1e0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1c1f0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1c200 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1c210 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1c220 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1c230 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
1c240 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
1c250 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1c260 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1c270 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1c280 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1c290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1c2a0 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71  repare16(db, zSq
1c2b0 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
1c2c0 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
1c2d0 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73  il : 0);.  if( s
1c2e0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1c2f0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1c300 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1c310 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
1c320 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1c330 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c340 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  f( objc>=5 ){.  
1c350 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
1c360 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62       objlen = ob
1c370 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38  jlen - (int)((u8
1c380 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
1c390 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
1c3a0 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1c3b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  0;.    }.    pTa
1c3c0 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  il = Tcl_NewByte
1c3d0 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a  ArrayObj((u8 *)z
1c3e0 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20  Tail, objlen);. 
1c3f0 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1c400 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20  unt(pTail);.    
1c410 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1c420 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1c430 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20  0, pTail, 0);.  
1c440 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1c450 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a  nt(pTail);.  }..
1c460 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1c470 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1c480 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1c490 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1c4a0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1c4b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1c4c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c4d0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1c4e0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1c4f0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1c500 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1c510 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c520 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
1c530 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62  re16_v2 DB sql b
1c540 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  ytes ?tailvar?.*
1c550 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
1c560 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
1c570 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
1c580 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
1c590 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
1c5a0 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
1c5b0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
1c5c0 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
1c5d0 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
1c5e0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
1c5f0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1c600 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
1c610 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
1c620 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
1c630 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
1c640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1c650 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  st_prepare16_v2(
1c660 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c670 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c680 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c690 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c6a0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c6b0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1c6c0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1c6d0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1c6e0 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a  nst void *zSql;.
1c6f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54    const void *zT
1c700 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f  ail = 0;.  Tcl_O
1c710 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20  bj *pTail = 0;. 
1c720 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c730 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1c740 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e   zBuf[50]; .  in
1c750 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65  t rc;.  int byte
1c760 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1c770 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
1c780 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72   specified as ar
1c790 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  g 3 */.  int obj
1c7a0 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
1c7b0 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61     /* The byte-a
1c7c0 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61  rray length of a
1c7d0 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  rg 2 */..  if( o
1c7e0 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1c7f0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1c800 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c810 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1c820 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1c830 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1c840 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1c850 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  " DB sql bytes ?
1c860 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20  tailvar?", 0);. 
1c870 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c880 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1c890 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1c8a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c8b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1c8c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c8d0 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
1c8e0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1c8f0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
1c900 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  objlen);.  if( T
1c910 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1c920 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
1c930 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1c940 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1c950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1c960 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a  epare16_v2(db, z
1c970 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
1c980 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
1c990 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28  Tail : 0);.  if(
1c9a0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1c9b0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
1c9c0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1c9d0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1c9e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1c9f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1ca00 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a   if( objc>=5 ){.
1ca10 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b      if( zTail ){
1ca20 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1ca30 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28  objlen - (int)((
1ca40 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
1ca50 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  )zSql);.    }els
1ca60 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  e{.      objlen 
1ca70 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
1ca80 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  Tail = Tcl_NewBy
1ca90 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a  teArrayObj((u8 *
1caa0 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b  )zTail, objlen);
1cab0 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1cac0 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1cad0 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1cae0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1caf0 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a  , 0, pTail, 0);.
1cb00 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1cb10 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d  ount(pTail);.  }
1cb20 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1cb30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1cb40 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1cb50 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1cb60 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1cb70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1cb80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1cb90 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1cba0 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1cbb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1cbc0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1cbd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1cbe0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1cbf0 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69  n filename ?opti
1cc00 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61  ons-list?.*/.sta
1cc10 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
1cc20 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1cc30 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1cc40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1cc50 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1cc60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1cc70 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
1cc80 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
1cc90 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1cca0 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1ccb0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
1ccc0 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
1ccd0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=1 ){.    Tcl_A
1cce0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ccf0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1cd00 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1cd10 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1cd20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1cd30 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
1cd40 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
1cd50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1cd60 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
1cd70 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20  lename = objc>1 
1cd80 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  ? Tcl_GetString(
1cd90 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20  objv[1]) : 0;.  
1cda0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
1cdb0 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
1cdc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1cdd0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1cde0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1cdf0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1ce00 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1ce10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1ce20 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
1ce30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ce40 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1ce50 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c  ite3_open_v2 FIL
1ce60 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 0a  ENAME FLAGS VFS.
1ce70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1ce80 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f  st_open_v2(.  vo
1ce90 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1cea0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ceb0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1cec0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1ced0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1cee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1cef0 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  ename;.  const c
1cf00 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74  har *zVfs;.  int
1cf10 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71   flags = 0;.  sq
1cf20 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1cf30 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
1cf40 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46  [100];..  int nF
1cf50 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  lag;.  Tcl_Obj *
1cf60 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69  *apFlag;.  int i
1cf70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
1cf80 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1cf90 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1cfa0 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
1cfb0 41 4d 45 20 46 4c 41 47 53 20 56 46 53 22 29 3b  AME FLAGS VFS");
1cfc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1cfd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69  ERROR;.  }.  zFi
1cfe0 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
1cff0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
1d000 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65  .  zVfs = Tcl_Ge
1d010 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
1d020 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d  ;.  if( zVfs[0]=
1d030 3d 30 78 30 30 20 29 20 7a 56 66 73 20 3d 20 30  =0x00 ) zVfs = 0
1d040 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69  ;..  rc = Tcl_Li
1d050 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
1d060 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1d070 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61  , &nFlag, &apFla
1d080 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  g);.  if( rc!=TC
1d090 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
1d0a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1d0b0 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Flag; i++){.    
1d0c0 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20 20 73  int iFlag;.    s
1d0d0 74 72 75 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b  truct OpenFlag {
1d0e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1d0f0 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20  r *zFlag;.      
1d100 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20  int flag;.    } 
1d110 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  aFlag[] = {.    
1d120 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1d130 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49  _READONLY", SQLI
1d140 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1d150 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d160 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1d170 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE", SQLITE_OPEN
1d180 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 0a 20 20  _READWRITE },.  
1d190 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d1a0 45 4e 5f 43 52 45 41 54 45 22 2c 20 53 51 4c 49  EN_CREATE", SQLI
1d1b0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
1d1c0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1d1d0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1d1e0 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  LOSE", SQLITE_OP
1d1f0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1d200 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d210 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1d220 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE", SQLITE_OPEN
1d230 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20  _EXCLUSIVE },.  
1d240 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d250 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20 53  EN_AUTOPROXY", S
1d260 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1d270 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ROXY },.      { 
1d280 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  "SQLITE_OPEN_MAI
1d290 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50  N_DB", SQLITE_OP
1d2a0 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20  EN_MAIN_DB },.  
1d2b0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d2c0 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c  EN_TEMP_DB", SQL
1d2d0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1d2e0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d2f0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1d300 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f  NT_DB", SQLITE_O
1d310 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
1d320 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d330 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1d340 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1d350 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1d360 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d370 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
1d380 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1d390 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1d3a0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d3b0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1d3c0 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1d3d0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  N_SUBJOURNAL },.
1d3e0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1d3f0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1d400 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1d410 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1d420 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d430 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
1d440 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  ", SQLITE_OPEN_N
1d450 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20  OMUTEX },.      
1d460 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  { "SQLITE_OPEN_F
1d470 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49 54  ULLMUTEX", SQLIT
1d480 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
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 48 41 52 45 44 43  ITE_OPEN_SHAREDC
1d4b0 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ACHE", SQLITE_OP
1d4c0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d  EN_SHAREDCACHE }
1d4d0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1d4e0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
1d4f0 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  CHE", SQLITE_OPE
1d500 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
1d510 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1d520 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c  E_OPEN_WAL", SQL
1d530 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a  ITE_OPEN_WAL },.
1d540 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1d550 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54  OPEN_URI", SQLIT
1d560 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20  E_OPEN_URI },.  
1d570 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
1d580 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c   };.    rc = Tcl
1d590 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
1d5a0 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20 61  Struct(interp, a
1d5b0 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c  pFlag[i], aFlag,
1d5c0 20 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d   sizeof(aFlag[0]
1d5d0 29 2c 20 0a 20 20 20 20 20 20 20 20 22 66 6c 61  ), .        "fla
1d5e0 67 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20 20  g", 0, &iFlag.  
1d5f0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
1d600 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
1d610 20 72 63 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c   rc;.    flags |
1d620 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66  = aFlag[iFlag].f
1d630 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  lag;.  }..  rc =
1d640 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1d650 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c  (zFilename, &db,
1d660 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20   flags, zVfs);. 
1d670 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1d680 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1d690 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29  nterp, zBuf, db)
1d6a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d6b0 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ROR;.  Tcl_Appen
1d6c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1d6d0 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
1d6e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1d6f0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1d700 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61  e3_open16 filena
1d710 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74  me options.*/.st
1d720 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70  atic int test_op
1d730 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  en16(.  void * c
1d740 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d750 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d760 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d770 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d780 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1d790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1d7a0 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  6.  const void *
1d7b0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
1d7c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
1d7d0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1d7e0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1d7f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d800 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1d810 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1d820 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1d830 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d840 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e  bjv[0]), " filen
1d850 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74  ame options-list
1d860 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1d870 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d880 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ..  zFilename = 
1d890 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1d8a0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
1d8b0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f   0);.  sqlite3_o
1d8c0 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c  pen16(zFilename,
1d8d0 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20   &db);.  .  if( 
1d8e0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1d8f0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1d900 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65  , zBuf, db) ) re
1d910 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d920 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d930 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1d940 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1d950 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1d960 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1d970 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1d980 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d  age: sqlite3_com
1d990 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20  plete16 <UTF-16 
1d9a0 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65  string>.**.** Re
1d9b0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 73 75  turn 1 if the su
1d9c0 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20  pplied argument 
1d9d0 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
1d9e0 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20  L statement, or 
1d9f0 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
1da00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1da10 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36   test_complete16
1da20 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1da30 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1da40 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1da50 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1da60 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1da70 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .){.#if !defined
1da80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d  (SQLITE_OMIT_COM
1da90 50 4c 45 54 45 29 20 26 26 20 21 64 65 66 69 6e  PLETE) && !defin
1daa0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ed(SQLITE_OMIT_U
1dab0 54 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42  TF16).  char *zB
1dac0 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  uf;..  if( objc!
1dad0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1dae0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1daf0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74  p, 1, objv, "<ut
1db00 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20  f-16 sql>");.   
1db10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1db20 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d  R;.  }..  zBuf =
1db30 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
1db40 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1db50 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54  objv[1], 0);.  T
1db60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1db70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1db80 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ntObj(sqlite3_co
1db90 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29  mplete16(zBuf)))
1dba0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1dbb0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
1dbc0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   && SQLITE_OMIT_
1dbd0 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
1dbe0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1dbf0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1dc00 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a  3_step STMT.**.*
1dc10 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74  * Advance the st
1dc20 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e  atement to the n
1dc30 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ext row..*/.stat
1dc40 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70  ic int test_step
1dc50 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1dc60 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1dc70 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1dc80 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1dc90 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1dca0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1dcb0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1dcc0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1dcd0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1dce0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1dcf0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1dd00 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1dd10 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1dd20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1dd30 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
1dd40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1dd50 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1dd60 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1dd70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1dd80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1dd90 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1dda0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1ddb0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1ddc0 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28  Stmt);..  /* if(
1ddd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
1dde0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52   && rc!=SQLITE_R
1ddf0 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  OW ) return TCL_
1de00 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f  ERROR; */.  Tcl_
1de10 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1de20 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1de30 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
1de40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1de50 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
1de60 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a  st_sql(.  void *
1de70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1de80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1de90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1dea0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1deb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1dec0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1ded0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1dee0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1def0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1df00 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
1df10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1df20 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1df30 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1df40 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1df50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1df60 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1df70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1df80 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1df90 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
1dfa0 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
1dfb0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
1dfc0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1dfd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1dfe0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1dff0 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a  _count STMT .**.
1e000 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1e010 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1e020 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1e030 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54  sql statement ST
1e040 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MT..*/.static in
1e050 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f  t test_column_co
1e060 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
1e070 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1e080 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1e090 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1e0a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1e0b0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1e0c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1e0d0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1e0e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e0f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1e100 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1e110 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1e120 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1e130 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1e140 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1e150 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e160 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1e170 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1e180 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1e190 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1e1a0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1e1b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1e1c0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1e1d0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1e1e0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  tObj(sqlite3_col
1e1f0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
1e200 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1e210 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e220 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1e230 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f  umn_type STMT co
1e240 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
1e250 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  n the type of th
1e260 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
1e270 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
1e280 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f   current row..*/
1e290 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1e2a0 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20  _column_type(.  
1e2b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e2c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1e2d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1e2e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1e2f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1e300 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1e310 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1e320 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69  ;.  int tp;..  i
1e330 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1e340 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1e350 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1e360 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1e370 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1e380 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1e390 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1e3a0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1e3b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e3c0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1e3d0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1e3e0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1e3f0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1e400 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1e410 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1e420 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1e430 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1e440 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1e450 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74   TCL_ERROR;..  t
1e460 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  p = sqlite3_colu
1e470 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63  mn_type(pStmt, c
1e480 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74  ol);.  switch( t
1e490 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1e4a0 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20  LITE_INTEGER: . 
1e4b0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1e4c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45  lt(interp, "INTE
1e4d0 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  GER", TCL_STATIC
1e4e0 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
1e4f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e500 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c  _NULL:.      Tcl
1e510 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1e520 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53  p, "NULL", TCL_S
1e530 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
1e540 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1e550 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20  QLITE_FLOAT:.   
1e560 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1e570 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22  (interp, "FLOAT"
1e580 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1e590 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e5a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
1e5b0 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  T:.      Tcl_Set
1e5c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e5d0 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49  TEXT", TCL_STATI
1e5e0 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
1e5f0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1e600 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63  E_BLOB:.      Tc
1e610 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1e620 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f  rp, "BLOB", TCL_
1e630 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1e640 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1e650 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
1e660 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  (0);.  }..  retu
1e670 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1e680 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1e690 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20  e3_column_int64 
1e6a0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1e6b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1e6c0 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c  a in column 'col
1e6d0 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72  umn' of the curr
1e6e0 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20  ent row cast as 
1e6f0 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62  an.** wide (64-b
1e700 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  it) integer..*/.
1e710 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e720 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20  column_int64(.  
1e730 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e740 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1e750 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1e760 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1e770 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1e780 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1e790 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1e7a0 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20  ;.  i64 iVal;.. 
1e7b0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1e7c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e7d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1e7e0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1e7f0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1e800 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1e810 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1e820 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1e830 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e840 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1e850 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1e860 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1e870 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1e880 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1e890 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1e8a0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1e8b0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1e8c0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1e8d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1e8e0 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iVal = sqlite3_
1e8f0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
1e900 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
1e910 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1e920 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
1e930 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20  IntObj(iVal));. 
1e940 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1e950 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1e960 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1e970 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  lob STMT column.
1e980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1e990 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a  st_column_blob(.
1e9a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1e9b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1e9c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1e9d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1e9e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1e9f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1ea00 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1ea10 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  ol;..  int len;.
1ea20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1ea30 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  lob;..  if( objc
1ea40 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1ea50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ea60 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1ea70 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1ea80 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1ea90 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1eaa0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1eab0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1eac0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ead0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1eae0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1eaf0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1eb00 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1eb10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1eb20 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1eb30 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1eb40 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1eb50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1eb60 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71  ROR;..  len = sq
1eb70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1eb80 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  es(pStmt, col);.
1eb90 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    pBlob = sqlite
1eba0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
1ebb0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
1ebc0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1ebd0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
1ebe0 65 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c  eArrayObj(pBlob,
1ebf0 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e   len));.  return
1ec00 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1ec10 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1ec20 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53  _column_double S
1ec30 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1ec40 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1ec50 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75   in column 'colu
1ec60 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65  mn' of the curre
1ec70 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61  nt row cast as a
1ec80 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
1ec90 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
1eca0 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  mn_double(.  voi
1ecb0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1ecc0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1ecd0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1ece0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1ecf0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1ed00 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1ed10 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1ed20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20   double rVal;.. 
1ed30 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1ed40 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ed50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1ed60 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1ed70 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1ed80 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1ed90 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1eda0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1edb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1edc0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1edd0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1ede0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1edf0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1ee00 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1ee10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1ee20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1ee30 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1ee40 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1ee50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1ee60 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   rVal = sqlite3_
1ee70 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
1ee80 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
1ee90 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1eea0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75  terp, Tcl_NewDou
1eeb0 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20  bleObj(rVal));. 
1eec0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1eed0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1eee0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
1eef0 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  nt STMT .**.** R
1ef00 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1ef10 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
1ef20 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20  rned by the sql 
1ef30 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a  statement STMT..
1ef40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1ef50 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20  st_data_count(. 
1ef60 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1ef70 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ef80 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ef90 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1efa0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1efb0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1efc0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1efd0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1efe0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1eff0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f000 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f010 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1f020 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1f030 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1f040 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1f050 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f060 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1f070 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1f080 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1f090 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1f0a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f0b0 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  ROR;..  Tcl_SetO
1f0c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1f0d0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
1f0e0 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
1f0f0 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
1f100 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1f110 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1f120 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1f130 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1f140 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1f150 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
1f160 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
1f170 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1f180 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
1f190 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
1f1a0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1f1b0 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f 69 64 20  mt_utf8(.  void 
1f1c0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  * clientData,   
1f1d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1f1e0 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
1f1f0 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
1f200 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  oke */.  Tcl_Int
1f210 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f220 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1f230 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1f240 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1f250 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1f260 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68   col;.  const ch
1f270 61 72 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c  ar *(*xFunc)(sql
1f280 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
1f290 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1f2a0 7a 52 65 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d  zRet;..  xFunc =
1f2b0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a   (const char *(*
1f2c0 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1f2d0 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61   int))clientData
1f2e0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
1f2f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1f300 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1f310 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1f320 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1f330 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1f340 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1f350 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1f360 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f370 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1f380 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1f390 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1f3a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1f3b0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1f3c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f3d0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1f3e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1f3f0 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1f400 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f410 0a 20 20 7a 52 65 74 20 3d 20 78 46 75 6e 63 28  .  zRet = xFunc(
1f420 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69  pStmt, col);.  i
1f430 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 54  f( zRet ){.    T
1f440 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1f450 65 72 70 2c 20 28 63 68 61 72 20 2a 29 7a 52 65  erp, (char *)zRe
1f460 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
1f470 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1f480 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
1f490 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20  lobal_recover(. 
1f4a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1f4b0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1f4c0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1f4d0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1f4e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1f4f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f500 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
1f510 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1f520 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
1f530 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1f540 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1f550 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
1f560 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
1f580 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b  lobal_recover();
1f590 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1f5a0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1f5b0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1f5c0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23  , TCL_STATIC);.#
1f5d0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
1f5e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f5f0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1f600 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
1f610 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1f620 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1f630 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
1f640 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
1f650 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1f660 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
1f670 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
1f680 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  nt test_stmt_utf
1f690 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1f6a0 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
1f6b0 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
1f6c0 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
1f6d0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  o be invoked */.
1f6e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1f6f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1f700 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1f710 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1f720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f730 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
1f740 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1f750 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f  int col;.  Tcl_O
1f760 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73  bj *pRet;.  cons
1f770 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b  t void *zName16;
1f780 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28  .  const void *(
1f790 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
1f7a0 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20  stmt*, int);..  
1f7b0 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76  xFunc = (const v
1f7c0 6f 69 64 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  oid *(*)(sqlite3
1f7d0 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1f7e0 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1f7f0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1f800 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f810 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f820 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f830 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1f840 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1f850 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1f860 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1f870 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f880 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1f890 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1f8a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1f8b0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1f8c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f8d0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1f8e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1f8f0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1f900 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1f910 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65  _ERROR;..  zName
1f920 31 36 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74  16 = xFunc(pStmt
1f930 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e  , col);.  if( zN
1f940 61 6d 65 31 36 20 29 7b 0a 20 20 20 20 69 6e 74  ame16 ){.    int
1f950 20 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   n;.    const ch
1f960 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b  ar *z = zName16;
1f970 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b  .    for(n=0; z[
1f980 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b  n] || z[n+1]; n+
1f990 3d 32 29 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d  =2){}.    pRet =
1f9a0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
1f9b0 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b  yObj(zName16, n+
1f9c0 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  2);.    Tcl_SetO
1f9d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1f9e0 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64   pRet);.  }.#end
1f9f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1fa00 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65  T_UTF16 */..  re
1fa10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1fa20 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1fa30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20  ite3_column_int 
1fa40 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1fa50 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1fa60 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54  _column_bytes ST
1fa70 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1fa80 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1fa90 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54  olumn_bytes16 ST
1faa0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a  MT column.**.*/.
1fab0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1fac0 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64  stmt_int(.  void
1fad0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
1fae0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1faf0 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
1fb00 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
1fb10 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
1fb20 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1fb30 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1fb40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1fb50 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1fb60 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1fb70 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e  ol;.  int (*xFun
1fb80 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
1fb90 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63  , int);..  xFunc
1fba0 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71 6c 69   = (int (*)(sqli
1fbb0 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29  te3_stmt*, int))
1fbc0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  clientData;.  if
1fbd0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1fbe0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1fbf0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1fc00 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1fc10 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1fc20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1fc30 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1fc40 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1fc50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fc60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1fc70 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1fc80 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1fc90 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1fca0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1fcb0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1fcc0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1fcd0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1fce0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1fcf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1fd00 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1fd10 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1fd20 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d 74  tObj(xFunc(pStmt
1fd30 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75  , col)));.  retu
1fd40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1fd50 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1fd60 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 44 42  te_set_magic  DB
1fd70 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a    MAGIC-NUMBER.*
1fd80 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 62 2d  *.** Set the db-
1fd90 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20 20 54  >magic value.  T
1fda0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
1fdb0 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f 76 65  est error recove
1fdc0 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61  ry logic..*/.sta
1fdd0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73  tic int sqlite_s
1fde0 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64  et_magic(.  void
1fdf0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1fe00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1fe10 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1fe20 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1fe30 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1fe40 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1fe50 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1fe60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1fe70 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1fe80 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1fe90 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22  v[0],.         "
1fea0 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a   DB MAGIC", 0);.
1feb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1fec0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1fed0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1fee0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1fef0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1ff00 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72  ERROR;.  if( str
1ff10 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1ff20 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22  LITE_MAGIC_OPEN"
1ff30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1ff40 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1ff50 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGIC_OPEN;.  }el
1ff60 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
1ff70 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1ff80 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30  AGIC_CLOSED")==0
1ff90 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1ffa0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1ffb0 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65  _CLOSED;.  }else
1ffc0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1ffd0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1ffe0 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a  IC_BUSY")==0 ){.
1fff0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
20000 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
20010 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  Y;.  }else if( s
20020 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
20030 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
20040 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  OR")==0 ){.    d
20050 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
20060 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20  E_MAGIC_ERROR;. 
20070 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47   }else if( Tcl_G
20080 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
20090 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62  gv[2], (int*)&db
200a0 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20  ->magic) ){.    
200b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
200c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
200d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
200e0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
200f0 69 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a  interrupt  DB .*
20100 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20  *.** Trigger an 
20110 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a  interrupt on DB.
20120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
20130 73 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20  st_interrupt(.  
20140 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20150 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20160 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
20170 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
20180 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
20190 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
201a0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
201b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
201c0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
201d0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
201e0 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c   argv[0], " DB",
201f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
20200 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
20210 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
20220 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
20230 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
20240 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
20250 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
20260 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  db);.  return TC
20270 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
20280 75 38 20 2a 73 71 6c 69 74 65 33 5f 73 74 61 63  u8 *sqlite3_stac
20290 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a  k_baseline = 0;.
202a0 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
202b0 73 74 61 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f  stack with a kno
202c0 77 6e 20 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a  wn bitpattern..*
202d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
202e0 65 70 53 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20  epStack(void){. 
202f0 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 62 69   int i;.  u32 bi
20300 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66  gBuf[65536];.  f
20310 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
20320 28 62 69 67 42 75 66 29 2f 73 69 7a 65 6f 66 28  (bigBuf)/sizeof(
20330 62 69 67 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29  bigBuf[0]); i++)
20340 20 62 69 67 42 75 66 5b 69 5d 20 3d 20 30 78 64   bigBuf[i] = 0xd
20350 65 61 64 62 65 65 66 3b 0a 20 20 73 71 6c 69 74  eadbeef;.  sqlit
20360 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
20370 65 20 3d 20 28 75 38 2a 29 26 62 69 67 42 75 66  e = (u8*)&bigBuf
20380 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [65536];.}../*.*
20390 2a 20 47 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Get the curren
203a0 74 20 73 74 61 63 6b 20 64 65 70 74 68 2e 20 20  t stack depth.  
203b0 55 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  Used for debuggi
203c0 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20  ng only..*/.u64 
203d0 73 71 6c 69 74 65 33 53 74 61 63 6b 44 65 70 74  sqlite3StackDept
203e0 68 28 76 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b  h(void){.  u8 x;
203f0 0a 20 20 72 65 74 75 72 6e 20 28 75 36 34 29 28  .  return (u64)(
20400 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
20410 73 65 6c 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a  seline - &x);.}.
20420 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
20430 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65  qlite3_stack_use
20440 64 20 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54  d DB SQL.**.** T
20450 72 79 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68  ry to measure th
20460 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63  e amount of stac
20470 6b 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  k space used by 
20480 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
20490 33 5f 65 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63  3_exec.*/.static
204a0 20 69 6e 74 20 74 65 73 74 5f 73 74 61 63 6b 5f   int test_stack_
204b0 75 73 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  used(.  void * c
204c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
204d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
204e0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
204f0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
20500 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
20510 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63  nt i;.  if( argc
20520 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
20530 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
20540 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
20550 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
20560 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
20570 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30      " DB SQL", 0
20580 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20590 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
205a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
205b0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
205c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
205d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 72 65 70  CL_ERROR;.  prep
205e0 53 74 61 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64  Stack();.  (void
205f0 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62  )sqlite3_exec(db
20600 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c  , argv[2], 0, 0,
20610 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35   0);.  for(i=655
20620 33 35 3b 20 69 3e 3d 30 20 26 26 20 28 28 75 33  35; i>=0 && ((u3
20630 32 2a 29 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  2*)sqlite3_stack
20640 5f 62 61 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d  _baseline)[-i]==
20650 30 78 64 65 61 64 62 65 65 66 3b 20 69 2d 2d 29  0xdeadbeef; i--)
20660 7b 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  {}.  Tcl_SetObjR
20670 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
20680 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29  l_NewIntObj(i*4)
20690 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
206a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
206b0 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74  ge: sqlite_delet
206c0 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66 75  e_function DB fu
206d0 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a  nction-name.**.*
206e0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75 73 65  * Delete the use
206f0 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63  r function 'func
20700 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20  tion-name' from 
20710 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
20720 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73 73  DB. It.** is ass
20730 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 75 73  umed that the us
20740 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  er function was 
20750 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38 2c  created as UTF8,
20760 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   any number of.*
20770 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68 65  * arguments (the
20780 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
20790 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
207a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
207b0 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  elete_function(.
207c0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
207d0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
207e0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
207f0 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
20800 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
20810 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
20820 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
20830 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
20840 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
20850 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
20860 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
20870 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
20880 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
20890 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
208a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
208b0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
208c0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
208d0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
208e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
208f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
20900 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
20910 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53  , argv[2], -1, S
20920 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
20930 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  , 0, 0);.  Tcl_S
20940 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
20950 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
20960 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
20970 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
20980 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20990 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64   Usage: sqlite_d
209a0 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20  elete_collation 
209b0 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d  DB collation-nam
209c0 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
209d0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
209e0 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  uence 'collation
209f0 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61  -name' from data
20a00 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
20a10 44 42 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  DB. It is assume
20a20 64 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61  d that the colla
20a30 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61  tion sequence wa
20a40 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46  s created as UTF
20a50 38 20 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74  8 (the .** way t
20a60 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
20a70 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74   does it)..*/.st
20a80 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f  atic int delete_
20a90 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69  collation(.  voi
20aa0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
20ab0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20ac0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
20ad0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
20ae0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
20af0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
20b00 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
20b10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
20b20 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
20b30 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
20b40 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
20b50 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 66   .        " DB f
20b60 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30  unction-name", 0
20b70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20b80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
20b90 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
20ba0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
20bb0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
20bc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
20bd0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
20be0 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72  collation(db, ar
20bf0 67 76 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54  gv[2], SQLITE_UT
20c00 46 38 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  F8, 0, 0);.  Tcl
20c10 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
20c20 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
20c30 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
20c40 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
20c50 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
20c60 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
20c70 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
20c80 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
20c90 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74   true if the dat
20ca0 61 62 61 73 65 20 44 42 20 69 73 20 63 75 72 72  abase DB is curr
20cb0 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f  ently in auto-co
20cc0 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65  mmit mode..** Re
20cd0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f  turn false if no
20ce0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20cf0 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28   get_autocommit(
20d00 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
20d10 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
20d20 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
20d30 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
20d40 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20  *argv.){.  char 
20d50 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69  zBuf[30];.  sqli
20d60 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
20d70 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
20d80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
20d90 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
20da0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
20db0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
20dc0 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
20dd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20de0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
20df0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
20e00 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
20e10 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
20e20 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
20e30 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
20e40 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
20e50 22 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65  "%d", sqlite3_ge
20e60 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29  t_autocommit(db)
20e70 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
20e80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
20e90 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
20ea0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20eb0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
20ec0 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42  _busy_timeout DB
20ed0 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68   MS.**.** Set th
20ee0 65 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20  e busy timeout. 
20ef0 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61   This is more ea
20f00 73 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20  sily done using 
20f10 74 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d  the timeout.** m
20f20 65 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c  ethod of the TCL
20f30 20 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74   interface.  But
20f40 20 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74   we need a way t
20f50 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a  o test the case.
20f60 2a 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75  ** where it retu
20f70 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  rns SQLITE_MISUS
20f80 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
20f90 20 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f   test_busy_timeo
20fa0 75 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ut(.  void * cli
20fb0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
20fc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
20fd0 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
20fe0 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  r **argv.){.  in
20ff0 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69  t rc, ms;.  sqli
21000 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
21010 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
21020 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
21030 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
21040 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
21050 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
21060 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
21070 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
21080 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
21090 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
210a0 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
210b0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
210c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
210d0 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
210e0 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20  , argv[2], &ms) 
210f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
21100 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
21110 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
21120 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41  db, ms);.  Tcl_A
21130 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
21140 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
21150 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
21160 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21170 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74 63  /*.** Usage:  tc
21180 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 20  l_variable_type 
21190 56 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a  VARIABLENAME.**.
211a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
211b0 6d 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e  me of the intern
211c0 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
211d0 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c  n for the.** val
211e0 75 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ue of the given 
211f0 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
21200 74 69 63 20 69 6e 74 20 74 63 6c 5f 76 61 72 69  tic int tcl_vari
21210 61 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69  able_type(.  voi
21220 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
21230 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21240 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
21250 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
21260 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54  ST objv[].){.  T
21270 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20  cl_Obj *pVar;.  
21280 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
21290 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
212a0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
212b0 62 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29  bjv, "VARIABLE")
212c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
212d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56  _ERROR;.  }.  pV
212e0 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
212f0 45 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  Ex(interp, Tcl_G
21300 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
21310 29 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f  ), 0, TCL_LEAVE_
21320 45 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20  ERR_MSG);.  if( 
21330 70 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVar==0 ) return
21340 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
21350 28 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20  ( pVar->typePtr 
21360 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
21370 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
21380 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
21390 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e  (pVar->typePtr->
213a0 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a  name, -1));.  }.
213b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
213c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
213d0 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73    sqlite3_releas
213e0 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a  e_memory ?N?.**.
213f0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  ** Attempt to re
21400 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72  lease memory cur
21410 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20  rently held but 
21420 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71  not actually req
21430 75 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e  uired..** The in
21440 74 65 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e  teger N is the n
21450 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
21460 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
21470 72 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a  release.  The .*
21480 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
21490 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
214a0 6d 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20  memory actually 
214b0 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61  released..*/.sta
214c0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6c  tic int test_rel
214d0 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76  ease_memory(.  v
214e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
214f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
21500 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
21510 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
21520 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
21530 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
21540 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
21550 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21  MANAGEMENT) && !
21560 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
21570 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e  MIT_DISKIO).  in
21580 74 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a  t N;.  int amt;.
21590 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26    if( objc!=1 &&
215a0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
215b0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
215c0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
215d0 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65  , "?N?");.    re
215e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
215f0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
21600 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  2 ){.    if( Tcl
21610 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
21620 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
21630 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &N) ) return TCL
21640 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
21650 0a 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d  .    N = -1;.  }
21660 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33  .  amt = sqlite3
21670 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
21680 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  N);.  Tcl_SetObj
21690 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
216a0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74  cl_NewIntObj(amt
216b0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
216c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
216d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
216e0 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
216f0 5f 6d 65 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a  _memory DB.**.**
21700 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65   Attempt to rele
21710 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65  ase memory curre
21720 6e 74 6c 79 20 68 65 6c 64 20 62 79 20 64 61 74  ntly held by dat
21730 61 62 61 73 65 20 44 42 2e 20 20 52 65 74 75 72  abase DB.  Retur
21740 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
21750 63 6f 64 65 20 28 77 68 69 63 68 20 69 6e 20 74  code (which in t
21760 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
21770 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 77  mentation is alw
21780 61 79 73 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74  ays zero)..*/.st
21790 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62  atic int test_db
217a0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
217b0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
217c0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
217d0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
217e0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
217f0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
21800 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
21810 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
21820 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
21830 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
21840 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
21850 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65  v, "DB");.    re
21860 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21870 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
21880 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
21890 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
218a0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
218b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
218c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
218d0 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
218e0 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
218f0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
21900 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
21910 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
21920 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
21930 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64  sage:  sqlite3_d
21940 62 5f 63 61 63 68 65 66 6c 75 73 68 20 44 42 0a  b_cacheflush DB.
21950 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  **.** Attempt to
21960 20 66 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79   flush any dirty
21970 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a   pages to disk..
21980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
21990 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68  st_db_cacheflush
219a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
219b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
219c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
219d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
219e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
219f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
21a00 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
21a10 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
21a20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
21a30 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
21a40 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
21a50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21a60 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
21a70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
21a80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
21a90 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
21aa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21ab0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
21ac0 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 64 62  db_cacheflush(db
21ad0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
21ae0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
21af0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
21b00 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72  )sqlite3ErrStr(r
21b10 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
21b20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
21b30 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54 63  ERROR;.  }..  Tc
21b40 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
21b50 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
21b60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
21b70 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
21b80 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 20 44 42  _system_errno DB
21b90 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
21ba0 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 73 79 73 74  e low-level syst
21bb0 65 6d 20 65 72 72 6e 6f 20 76 61 6c 75 65 2e 0a  em errno value..
21bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
21bd0 73 74 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28  st_system_errno(
21be0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
21bf0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
21c00 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
21c10 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
21c20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
21c30 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
21c40 3b 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 3b 0a  ;.  int iErrno;.
21c50 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
21c60 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
21c70 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
21c80 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
21c90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21ca0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
21cb0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
21cc0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
21cd0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
21ce0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
21cf0 4f 52 3b 0a 20 20 69 45 72 72 6e 6f 20 3d 20 73  OR;.  iErrno = s
21d00 71 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72  qlite3_system_er
21d10 72 6e 6f 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  rno(db);.  Tcl_S
21d20 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21d30 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
21d40 6a 28 69 45 72 72 6e 6f 29 29 3b 0a 20 20 72 65  j(iErrno));.  re
21d50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21d60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
21d70 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
21d80 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a  e DB DBNAME.**.*
21d90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
21da0 65 20 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f  e of a file asso
21db0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
21dc0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
21dd0 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 66 69  c int test_db_fi
21de0 6c 65 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a  lename(.  void *
21df0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
21e00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21e10 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
21e20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
21e30 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
21e40 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
21e50 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a   char *zDbName;.
21e60 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
21e70 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
21e80 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
21e90 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d   objv, "DB DBNAM
21ea0 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
21eb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
21ec0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
21ed0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
21ee0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
21ef0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
21f00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62  TCL_ERROR;.  zDb
21f10 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
21f20 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
21f30 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
21f40 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
21f50 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62  3_db_filename(db
21f60 2c 20 7a 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69  , zDbName), (voi
21f70 64 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  d*)0);.  return 
21f80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
21f90 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
21fa0 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20 44 42 20  _db_readonly DB 
21fb0 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74  DBNAME.**.** Ret
21fc0 75 72 6e 20 31 20 6f 72 20 30 20 69 66 20 44 42  urn 1 or 0 if DB
21fd0 4e 41 4d 45 20 69 73 20 72 65 61 64 6f 6e 6c 79  NAME is readonly
21fe0 20 6f 72 20 6e 6f 74 2e 20 20 52 65 74 75 72 6e   or not.  Return
21ff0 20 2d 31 20 69 66 20 44 42 4e 41 4d 45 20 64 6f   -1 if DBNAME do
22000 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 2e  es.** not exist.
22010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
22020 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  est_db_readonly(
22030 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
22040 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
22050 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
22060 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
22070 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
22080 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
22090 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
220a0 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f  zDbName;.  if( o
220b0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
220c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
220d0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
220e0 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20  "DB DBNAME");.  
220f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22100 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
22110 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
22120 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
22130 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
22140 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
22150 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20  OR;.  zDbName = 
22160 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22170 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 53 65  jv[2]);.  Tcl_Se
22180 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
22190 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
221a0 28 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64  (sqlite3_db_read
221b0 6f 6e 6c 79 28 64 62 2c 20 7a 44 62 4e 61 6d 65  only(db, zDbName
221c0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
221d0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
221e0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
221f0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f  oft_heap_limit ?
22200 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f  N?.**.** Query o
22210 72 20 73 65 74 20 74 68 65 20 73 6f 66 74 20 68  r set the soft h
22220 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68  eap limit for th
22230 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
22240 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20  .  The.** limit 
22250 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20  is only changed 
22260 69 66 20 74 68 65 20 4e 20 69 73 20 70 72 65 73  if the N is pres
22270 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f  ent.  The previo
22280 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72  us limit.** is r
22290 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
222a0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6f 66 74  ic int test_soft
222b0 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76  _heap_limit(.  v
222c0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
222d0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
222e0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
222f0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
22300 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
22310 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61   sqlite3_int64 a
22320 6d 74 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e  mt;.  Tcl_WideIn
22330 74 20 4e 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  t N = -1;.  if( 
22340 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21  objc!=1 && objc!
22350 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    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 3f 4e 3f  p, 1, objv, "?N?
22380 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
22390 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
223a0 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
223b0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69     if( Tcl_GetWi
223c0 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
223d0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e  erp, objv[1], &N
223e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
223f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20  RROR;.  }.  amt 
22400 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68  = sqlite3_soft_h
22410 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a  eap_limit64(N);.
22420 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
22430 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
22440 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 61 6d 74  ewWideIntObj(amt
22450 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
22460 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
22470 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 74  age:   sqlite3_t
22480 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a  hread_cleanup.**
22490 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c  .** Call the sql
224a0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
224b0 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  nup API..*/.stat
224c0 69 63 20 69 6e 74 20 74 65 73 74 5f 74 68 72 65  ic int test_thre
224d0 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76 6f  ad_cleanup(.  vo
224e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
224f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22500 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
22510 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
22520 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
22530 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22540 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73  T_DEPRECATED.  s
22550 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
22560 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66 0a  eanup();.#endif.
22570 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
22590 20 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72     sqlite3_pager
225a0 5f 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a 2a  _refcounts  DB.*
225b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69  *.** Return a li
225c0 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77 68  st of numbers wh
225d0 69 63 68 20 61 72 65 20 74 68 65 20 50 61 67 65  ich are the Page
225e0 72 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61 6c  rRefcount for al
225f0 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20 65  l.** pagers on e
22600 61 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ach database con
22610 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
22620 69 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67 65  ic int test_page
22630 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20 76  r_refcounts(.  v
22640 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
22650 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
22660 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
22670 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
22680 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
22690 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
226a0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c 20  int i;.  int v, 
226b0 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  *a;.  Tcl_Obj *p
226c0 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 6f  Result;..  if( o
226d0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
226e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
226f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
22700 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
22710 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
22720 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
22730 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
22740 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
22750 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22760 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
22770 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
22780 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
22790 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
227a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
227b0 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
227c0 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72 28  NewObj();.  for(
227d0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
227e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
227f0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20  ->aDb[i].pBt==0 
22800 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31 3b  ){.      v = -1;
22810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22820 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22830 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
22840 3b 0a 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69  ;.      a = sqli
22850 74 65 33 50 61 67 65 72 53 74 61 74 73 28 73 71  te3PagerStats(sq
22860 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
22870 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29  db->aDb[i].pBt))
22880 3b 0a 20 20 20 20 20 20 76 20 3d 20 61 5b 30 5d  ;.      v = a[0]
22890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
228a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
228b0 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
228c0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
228d0 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
228e0 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e  esult, Tcl_NewIn
228f0 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20  tObj(v));.  }.  
22900 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
22910 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74  (interp, pResult
22920 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
22930 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
22940 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f  lcmd:   working_
22950 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20  64bit_int.**.** 
22960 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20  Some TCL builds 
22970 28 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20  (ex: cygwin) do 
22980 6e 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62  not support 64-b
22990 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  it integers.  Th
229a0 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61  is.** leads to a
229b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20   number of test 
229c0 66 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70  failures.  The p
229d0 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63  resent command c
229e0 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c  hecks the.** TCL
229f0 20 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68   build to see wh
22a00 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20  ether or not it 
22a10 73 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20  supports 64-bit 
22a20 69 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a  integers.  It.**
22a30 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66   returns TRUE if
22a40 20 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c   it does and FAL
22a50 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  SE if not..**.**
22a60 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   This command is
22a70 20 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73   used to warn us
22a80 65 72 73 20 74 68 61 74 20 74 68 65 69 72 20 54  ers that their T
22a90 43 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66 65  CL build is defe
22aa0 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61  ctive.** and tha
22ab0 74 20 74 68 65 20 65 72 72 6f 72 73 20 74 68 65  t the errors the
22ac0 79 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20  y are seeing in 
22ad0 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
22ae0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72   might be.** a r
22af0 65 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64  esult of their d
22b00 65 66 65 63 74 69 76 65 20 54 43 4c 20 72 61 74  efective TCL rat
22b10 68 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d  her than problem
22b20 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  s in SQLite..*/.
22b30 73 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b 69  static int worki
22b40 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20 20  ng_64bit_int(.  
22b50 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
22b60 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
22b70 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
22b80 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
22b90 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
22ba0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
22bb0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
22bc0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
22bd0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
22be0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
22bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22c00 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
22c10 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
22c20 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
22c30 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
22c40 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62  s */.){.  Tcl_Ob
22c50 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69  j *pTestObj;.  i
22c60 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a  nt working = 0;.
22c70 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54 63  .  pTestObj = Tc
22c80 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
22c90 31 30 30 30 30 30 30 2a 28 69 36 34 29 31 32 33  1000000*(i64)123
22ca0 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b  4567890);.  work
22cb0 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63 6c  ing = strcmp(Tcl
22cc0 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65 73 74  _GetString(pTest
22cd0 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38 39  Obj), "123456789
22ce0 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20  0000000")==0;.  
22cf0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
22d00 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63  (pTestObj);.  Tc
22d10 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
22d20 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
22d30 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67  oleanObj(working
22d40 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
22d50 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  _OK;.}.../*.** t
22d60 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 6c  clcmd:   vfs_unl
22d70 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54  ink_test.**.** T
22d80 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
22d90 75 6e 72 65 67 69 73 74 65 72 73 20 74 68 65 20  unregisters the 
22da0 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64 20  primary VFS and 
22db0 74 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a 2a  then registers.*
22dc0 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e  * it back again.
22dd0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
22de0 6f 20 74 65 73 74 20 74 68 65 20 61 62 69 6c 69  o test the abili
22df0 74 79 20 74 6f 20 72 65 67 69 73 74 65 72 20 61  ty to register a
22e00 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f 6e  .** VFS when non
22e10 65 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c 79  e are previously
22e20 20 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e 64   registered, and
22e30 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   the ability to 
22e40 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20 74  .** unregister t
22e50 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  he only availabl
22e60 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20 23  e VFS.  Ticket #
22e70 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20 69  2738.*/.static i
22e80 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65  nt vfs_unlink_te
22e90 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
22ea0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
22eb0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
22ec0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
22ed0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
22ee0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
22ef0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
22f00 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
22f10 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
22f20 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
22f30 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
22f40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
22f50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
22f60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
22f70 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
22f80 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
22f90 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
22fa0 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73  _vfs *pMain;.  s
22fb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66  qlite3_vfs *apVf
22fc0 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  s[20];.  sqlite3
22fd0 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a  _vfs one, two;..
22fe0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
22ff0 72 65 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f  register(0);   /
23000 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20  * Unregister of 
23010 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73  NULL is harmless
23020 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20   */.  one.zName 
23030 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f  = "__one";.  two
23040 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22  .zName = "__two"
23050 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20  ;..  /* Calling 
23060 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
23070 73 74 65 72 20 77 69 74 68 20 32 6e 64 20 61 72  ster with 2nd ar
23080 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73  gument of 0 does
23090 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65   not.  ** change
230a0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
230b0 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20  .  */.  pMain = 
230c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
230d0 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  (0);.  sqlite3_v
230e0 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
230f0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
23100 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69  pMain==0 || pMai
23110 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  n==sqlite3_vfs_f
23120 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69  ind(0) );.  sqli
23130 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
23140 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73  (&two, 0);.  ass
23150 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c  ert( pMain==0 ||
23160 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f   pMain==sqlite3_
23170 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a  vfs_find(0) );..
23180 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64    /* We can find
23190 20 61 20 56 46 53 20 62 79 20 69 74 73 20 6e 61   a VFS by its na
231a0 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  me */.  assert( 
231b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
231c0 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
231d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
231e0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
231f0 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
23200 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71  .  /* Calling sq
23210 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65  lite_vfs_registe
23220 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20  r with non-zero 
23230 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
23240 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a   changes the.  *
23250 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65  * default VFS, e
23260 76 65 6e 20 69 66 20 74 68 65 20 31 73 74 20 70  ven if the 1st p
23270 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65  arameter is an e
23280 78 69 73 74 69 67 20 56 46 53 20 74 68 61 74 20  xistig VFS that 
23290 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  is.  ** previous
232a0 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73  ly registered as
232b0 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74   the non-default
232c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
232d0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f  _vfs_register(&o
232e0 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74  ne, 1);.  assert
232f0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
23300 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
23310 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
23320 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
23330 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
23340 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23350 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
23360 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74  =&one );.  sqlit
23370 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
23380 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65  &two, 1);.  asse
23390 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
233a0 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
233b0 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  one );.  assert(
233c0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
233d0 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
233e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
233f0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
23400 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28  )==&two );.  if(
23410 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71   pMain ){.    sq
23420 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
23430 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20  er(pMain, 1);.  
23440 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23450 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
23460 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20  e")==&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 20 20 20 20  ")==&two );.    
234a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
234b0 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61  vfs_find(0)==pMa
234c0 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  in );.  }.  .  /
234d0 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66  * Unlink the def
234e0 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61  ault VFS.  Repea
234f0 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72  t until there ar
23500 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a  e no more VFSes.
23510 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e    ** registered.
23520 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
23530 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29   i<sizeof(apVfs)
23540 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d  /sizeof(apVfs[0]
23550 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56  ); i++){.    apV
23560 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f  fs[i] = sqlite3_
23570 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20  vfs_find(0);.   
23580 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b   if( apVfs[i] ){
23590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
235a0 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33  pVfs[i]==sqlite3
235b0 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
235c0 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
235d0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
235e0 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73  unregister(apVfs
235f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  [i]);.      asse
23600 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
23610 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
23620 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
23630 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
23640 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
23650 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f  ind(0) );.  .  /
23660 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6d  * Register the m
23670 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64  ain VFS as non-d
23680 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20  efault (will be 
23690 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69  made default, si
236a0 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62  nce.  ** it'll b
236b0 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69  e the only one i
236c0 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20  n existence)..  
236d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
236e0 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c  _register(pMain,
236f0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73   0);.  assert( s
23700 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
23710 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a  0)==pMain );.  .
23720 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72    /* Un-register
23730 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67   the main VFS ag
23740 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ain to restore a
23750 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74  n empty VFS list
23760 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
23770 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61  s_unregister(pMa
23780 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  in);.  assert( 0
23790 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
237a0 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52  nd(0) );..  /* R
237b0 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20  elink all VFSes 
237c0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
237d0 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73  . */  .  for(i=s
237e0 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a  izeof(apVfs)/siz
237f0 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b  eof(apVfs[0])-1;
23800 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
23810 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b   if( apVfs[i] ){
23820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
23830 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66  fs_register(apVf
23840 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20  s[i], 1);.      
23850 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
23860 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
23870 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61  nd(0) );.      a
23880 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
23890 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
238a0 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
238b0 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e) );.    }.  }.
238c0 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72  .  /* Unregister
238d0 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65   out sample VFSe
238e0 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  s. */.  sqlite3_
238f0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
23900 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  one);.  sqlite3_
23910 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
23920 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65  two);..  /* Unre
23930 67 69 73 74 65 72 69 6e 67 20 61 20 56 46 53 20  gistering a VFS 
23940 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72  that is not curr
23950 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64  ently registered
23960 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a   is harmless */.
23970 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
23980 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a  register(&one);.
23990 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
239a0 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a  register(&two);.
239b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
239c0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
239d0 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  e")==0 );.  asse
239e0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
239f0 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30  find("__two")==0
23a00 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f   );..  /* We sho
23a10 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74 68  uld be left with
23a20 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   the original de
23a30 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61  fault VFS back a
23a40 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  s the.  ** origi
23a50 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nal */.  assert(
23a60 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
23a70 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a  d(0)==pMain );..
23a80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
23a90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
23aa0 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c  :   vfs_initfail
23ab0 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _test.**.** This
23ac0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74   TCL command att
23ad0 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e  empts to vfs_fin
23ae0 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74  d and vfs_regist
23af0 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73  er when the.** s
23b00 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
23b10 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73  e() interface is
23b20 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63   failing.  All c
23b30 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c  alls should fail
23b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23b50 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
23b60 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23b70 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
23b80 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
23b90 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
23ba0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
23bb0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
23bc0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
23bd0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23be0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23bf0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23c00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23c10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
23c20 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
23c30 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23c40 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
23c50 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
23c60 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a  qlite3_vfs one;.
23c70 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f    one.zName = "_
23c80 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71  _one";..  if( sq
23c90 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
23ca0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
23cb0 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
23cc0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
23cd0 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  e, 0);.  if( sql
23ce0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
23cf0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
23d00 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ROR;.  sqlite3_v
23d10 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
23d20 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 1);.  if( sqli
23d30 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
23d40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
23d50 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
23d60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61  _OK;.}../*.** Sa
23d70 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61  ved VFSes.*/.sta
23d80 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
23d90 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74  *apVfs[20];.stat
23da0 69 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b  ic int nVfs = 0;
23db0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
23dc0 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72    vfs_unregister
23dd0 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67  _all.**.** Unreg
23de0 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e  ister all VFSes.
23df0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
23e00 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c  fs_unregister_al
23e10 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l(.  ClientData 
23e20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
23e30 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
23e40 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
23e50 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
23e60 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
23e70 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
23e80 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23e90 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23ea0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23ec0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
23ed0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
23ee0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23ef0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
23f00 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
23f10 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
23f20 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 70 56   i<ArraySize(apV
23f30 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  fs); i++){.    a
23f40 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65  pVfs[i] = sqlite
23f50 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
23f60 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 3d     if( apVfs[i]=
23f70 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
23f80 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
23f90 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29  gister(apVfs[i])
23fa0 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20 69  ;.  }.  nVfs = i
23fb0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
23fc0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
23fd0 64 3a 20 20 20 76 66 73 5f 72 65 72 65 67 69 73  d:   vfs_reregis
23fe0 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65  ter_all.**.** Re
23ff0 73 74 6f 72 65 20 61 6c 6c 20 56 46 53 65 73 20  store all VFSes 
24000 74 68 61 74 20 77 65 72 65 20 72 65 6d 6f 76 65  that were remove
24010 64 20 75 73 69 6e 67 20 76 66 73 5f 75 6e 72 65  d using vfs_unre
24020 67 69 73 74 65 72 5f 61 6c 6c 2e 20 54 61 6b 69  gister_all. Taki
24030 6e 67 0a 2a 2a 20 63 61 72 65 20 74 6f 20 70 75  ng.** care to pu
24040 74 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  t the linked lis
24050 74 20 62 61 63 6b 20 74 6f 67 65 74 68 65 72 20  t back together 
24060 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
24070 72 20 61 73 20 69 74 20 77 61 73 0a 2a 2a 20 69  r as it was.** i
24080 6e 20 62 65 66 6f 72 65 20 76 66 73 5f 75 6e 72  n before vfs_unr
24090 65 67 69 73 74 65 72 5f 61 6c 6c 20 77 61 73 20  egister_all was 
240a0 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
240b0 69 63 20 69 6e 74 20 76 66 73 5f 72 65 72 65 67  ic int vfs_rereg
240c0 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69  ister_all(.  Cli
240d0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
240e0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
240f0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
24100 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24110 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24120 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
24130 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24140 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24150 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24160 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24170 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24180 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
24190 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
241a0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
241b0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
241c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
241d0 66 6f 72 28 69 3d 6e 56 66 73 2d 31 3b 20 69 3e  for(i=nVfs-1; i>
241e0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 73 71  =0; i--){.    sq
241f0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
24200 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b  er(apVfs[i], 1);
24210 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
24220 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
24230 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
24240 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44 42 0a 2a  ontrol_test DB.*
24250 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
24260 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
24270 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24280 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
24290 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
242a0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
242b0 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  of the same..*/.
242c0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
242d0 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28 0a 20 20  control_test(.  
242e0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
242f0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
24300 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
24310 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
24320 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
24330 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
24340 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
24350 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
24360 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
24370 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
24380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24390 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
243a0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
243b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
243c0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
243d0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41  s */.){.  int iA
243e0 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  rg = 0;.  sqlite
243f0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
24400 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
24410 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
24420 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24430 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
24440 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
24450 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
24460 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
24470 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
24480 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24490 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
244a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
244b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
244c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
244d0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
244e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
244f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
24500 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30 2c 20 26  trol(db, 0, 0, &
24510 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
24520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
24530 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20 73  OUND );.  rc = s
24540 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24550 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61 64 61 74  rol(db, "notadat
24560 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45 5f 46  abase", SQLITE_F
24570 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20  CNTL_LOCKSTATE, 
24580 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
24590 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
245a0 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OR );.  rc = sql
245b0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
245c0 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 2d 31  l(db, "main", -1
245d0 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
245e0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
245f0 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20  OTFOUND );.  rc 
24600 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
24610 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65 6d 70  ontrol(db, "temp
24620 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
24630 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
24640 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 7c 7c 20  ITE_NOTFOUND || 
24650 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
24660 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   );..  return TC
24670 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
24680 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
24690 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
246a0 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
246b0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
246c0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
246d0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
246e0 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
246f0 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
24700 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
24710 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
24720 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74  NO verb..*/.stat
24730 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
24740 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
24750 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
24760 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
24770 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
24780 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
24790 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
247a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
247b0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
247c0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
247d0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
247e0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
247f0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24800 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24810 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
24820 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24830 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
24840 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24850 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20  int iArg = 0;.  
24860 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
24870 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
24880 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
24890 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
248a0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
248b0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
248c0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
248d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
248e0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
248f0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
24900 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24910 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
24920 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
24930 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
24940 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
24950 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24960 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
24970 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24980 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
24990 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c  LITE_LAST_ERRNO,
249a0 20 26 69 41 72 67 29 3b 0a 20 20 69 66 28 20 72   &iArg);.  if( r
249b0 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65  c ){ .    Tcl_Se
249c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
249d0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
249e0 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75  (rc)); .    retu
249f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20  rn TCL_ERROR; . 
24a00 20 7d 0a 20 20 69 66 28 20 69 41 72 67 21 3d 30   }.  if( iArg!=0
24a10 20 29 20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70   ) {.    Tcl_App
24a20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24a30 2c 20 22 55 6e 65 78 70 65 63 74 65 64 20 6e 6f  , "Unexpected no
24a40 6e 2d 7a 65 72 6f 20 65 72 72 6e 6f 3a 20 22 2c  n-zero errno: ",
24a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24a60 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
24a70 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e  ingFromObj(Tcl_N
24a80 65 77 49 6e 74 4f 62 6a 28 69 41 72 67 29 2c 20  ewIntObj(iArg), 
24a90 30 29 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20 20  0), " ", 0);.   
24aa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24ab0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
24ac0 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
24ad0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
24ae0 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73  e_control_chunks
24af0 69 7a 65 5f 74 65 73 74 20 44 42 20 44 42 4e 41  ize_test DB DBNA
24b00 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68  ME SIZE.**.** Th
24b10 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
24b20 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
24b30 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
24b40 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
24b50 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
24b60 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
24b70 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
24b80 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20  ROXYFILE and.** 
24b90 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
24ba0 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a  ROXYFILE verbs..
24bb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
24bc0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
24bd0 73 69 7a 65 5f 74 65 73 74 28 0a 20 20 43 6c 69  size_test(.  Cli
24be0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
24bf0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
24c00 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
24c10 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24c20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24c30 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
24c40 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24c50 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24c60 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24c70 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24c80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24c90 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
24ca0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
24cb0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
24cc0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
24cd0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65  /.){.  int nSize
24ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24cf0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 68         /* New ch
24d00 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68  unk size */.  ch
24d10 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d30 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22   Db name ("main"
24d40 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a  , "temp" etc.) *
24d50 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24d80 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
24d90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
24db0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65  ile_control() re
24dc0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
24dd0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
24de0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
24df0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
24e00 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20  bjv, "DB DBNAME 
24e10 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75  SIZE");.    retu
24e20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24e30 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
24e40 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
24e50 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
24e60 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c  1]), &db) .   ||
24e70 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
24e80 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
24e90 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b  3], &nSize).  ){
24ea0 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  .   return TCL_E
24eb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
24ec0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
24ed0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
24ee0 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a  zDb[0]=='\0' ) z
24ef0 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63  Db = NULL;..  rc
24f00 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
24f10 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
24f20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
24f30 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69 64 20  UNK_SIZE, (void 
24f40 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28  *)&nSize);.  if(
24f50 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53   rc ){.    Tcl_S
24f60 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
24f70 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
24f80 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  ErrName(rc), TCL
24f90 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
24fa0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24fb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
24fc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
24fd0 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
24fe0 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
24ff0 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  st DB DBNAME SIZ
25000 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
25010 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
25020 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
25030 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
25040 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45   .** with SQLITE
25050 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
25060 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
25070 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
25080 68 69 6e 74 5f 74 65 73 74 28 0a 20 20 43 6c 69  hint_test(.  Cli
25090 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
250a0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
250b0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
250c0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
250d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
250e0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
250f0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
25100 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
25110 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
25120 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
25130 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25140 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
25150 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
25160 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
25170 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
25180 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49  /.){.  Tcl_WideI
25190 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  nt nSize;       
251a0 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 65 64         /* Hinted
251b0 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20   size */.  char 
251c0 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
251d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62             /* Db
251e0 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22   name ("main", "
251f0 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20  temp" etc.) */. 
25200 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
25230 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  dle */.  int rc;
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
25260 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72  _control() retur
25270 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
25280 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
25290 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
252a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
252b0 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  , "DB DBNAME SIZ
252c0 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
252d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
252e0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
252f0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
25300 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
25310 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63  , &db) .   || Tc
25320 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
25330 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
25340 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29  [3], &nSize).  )
25350 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
25360 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
25370 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
25380 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
25390 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20   zDb[0]=='\0' ) 
253a0 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72  zDb = NULL;..  r
253b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
253c0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
253d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
253e0 49 5a 45 5f 48 49 4e 54 2c 20 28 76 6f 69 64 20  IZE_HINT, (void 
253f0 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28  *)&nSize);.  if(
25400 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53   rc ){.    Tcl_S
25410 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
25420 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
25430 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  ErrName(rc), TCL
25440 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
25450 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
25470 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
25480 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
25490 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
254a0 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a  est DB PWD.**.**
254b0 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
254c0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
254d0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
254e0 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
254f0 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
25500 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
25510 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  he SQLITE_GET_LO
25520 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a  CKPROXYFILE and.
25530 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  ** SQLITE_SET_LO
25540 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62  CKPROXYFILE verb
25550 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
25560 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f   file_control_lo
25570 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20 20  ckproxy_test(.  
25580 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25590 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
255a0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
255b0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
255c0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
255d0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
255e0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
255f0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
25600 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
25610 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
25620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25630 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
25640 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
25650 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
25660 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
25670 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
25680 33 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66 28 20  3 *db;.  .  if( 
25690 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
256a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
256b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
256c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
256d0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20   \"",.          
256e0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
256f0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
25700 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
25710 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20 20  B PWD", 0);.    
25720 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
25740 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
25750 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25760 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
25770 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  .   return TCL_E
25780 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69 66  RROR;.  }.  .#if
25790 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
257a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
257b0 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
257c0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
257d0 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
257e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
257f0 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
25800 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
25810 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25820 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
25830 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
25840 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
25850 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
25860 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
25870 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  ).  {.    char *
25880 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69 6e  testPath;.    in
25890 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 50  t rc;.    int nP
258a0 77 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  wd;.    const ch
258b0 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20 63 68  ar *zPwd;.    ch
258c0 61 72 20 70 72 6f 78 79 50 61 74 68 5b 34 30 30  ar proxyPath[400
258d0 5d 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50 77 64  ];.    .    zPwd
258e0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
258f0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
25900 20 26 6e 50 77 64 29 3b 0a 20 20 20 20 69 66 28   &nPwd);.    if(
25910 20 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61 74   sizeof(proxyPat
25920 68 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a 20 20  h)<nPwd+20 ){.  
25930 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
25940 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 50 57  sult(interp, "PW
25950 44 20 74 6f 6f 20 62 69 67 22 2c 20 28 76 6f 69  D too big", (voi
25960 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  d*)0);.      ret
25970 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25980 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25990 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
259a0 28 70 72 6f 78 79 50 61 74 68 29 2c 20 70 72 6f  (proxyPath), pro
259b0 78 79 50 61 74 68 2c 20 22 25 73 2f 74 65 73 74  xyPath, "%s/test
259c0 2e 70 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a  .proxy", zPwd);.
259d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
259e0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
259f0 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53  , NULL, SQLITE_S
25a00 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
25a10 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
25a20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25a30 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
25a40 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
25a50 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a  ewIntObj(rc)); .
25a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
25a70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
25a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
25a90 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
25aa0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54  NULL, SQLITE_GET
25ab0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
25ac0 26 74 65 73 74 50 61 74 68 29 3b 0a 20 20 20 20  &testPath);.    
25ad0 69 66 28 20 73 74 72 6e 63 6d 70 28 70 72 6f 78  if( strncmp(prox
25ae0 79 50 61 74 68 2c 74 65 73 74 50 61 74 68 2c 31  yPath,testPath,1
25af0 31 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  1) ){.      Tcl_
25b00 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
25b10 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79  erp, "Lock proxy
25b20 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61   file did not ma
25b30 74 63 68 20 74 68 65 20 22 0a 20 20 20 20 20 20  tch the ".      
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b50 20 20 20 20 20 20 20 20 20 22 70 72 65 76 69 6f           "previo
25b60 75 73 6c 79 20 61 73 73 69 67 6e 65 64 20 76 61  usly assigned va
25b70 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  lue", 0);.      
25b80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25ba0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
25bb0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
25bc0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
25bd0 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72  bj(rc));.      r
25be0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25bf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
25c00 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
25c10 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
25c20 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
25c30 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61  OXYFILE, proxyPa
25c40 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  th);.    if( rc 
25c50 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
25c60 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
25c70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
25c80 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rc));.      retu
25c90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25ca0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
25cb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
25cc0 20 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   .}..#if SQLITE_
25cd0 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  OS_WIN./*.** tcl
25ce0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
25cf0 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74  rol_win32_av_ret
25d00 72 79 20 44 42 20 20 4e 52 45 54 52 59 20 20 44  ry DB  NRETRY  D
25d10 45 4c 41 59 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ELAY.**.** This 
25d20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
25d30 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
25d40 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
25d50 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ace with.** the 
25d60 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
25d70 33 32 5f 41 56 5f 52 45 54 52 59 20 6f 70 63 6f  32_AV_RETRY opco
25d80 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
25d90 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77  t file_control_w
25da0 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 28 0a 20  in32_av_retry(. 
25db0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
25dc0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
25dd0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
25de0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
25df0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
25e00 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25e10 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25e20 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
25e30 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
25e40 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
25e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25e60 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
25e70 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
25e80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
25e90 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25ea0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
25eb0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
25ec0 3b 0a 20 20 69 6e 74 20 61 5b 32 5d 3b 0a 20 20  ;.  int a[2];.  
25ed0 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20  char z[100];..  
25ee0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
25ef0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
25f00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
25f10 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
25f20 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
25f30 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
25f40 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
25f50 30 29 2c 20 22 20 44 42 20 4e 52 45 54 52 59 20  0), " DB NRETRY 
25f60 44 45 4c 41 59 22 2c 20 30 29 3b 0a 20 20 20 20  DELAY", 0);.    
25f70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25f80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
25f90 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
25fa0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25fb0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
25fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
25fd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
25fe0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
25ff0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
26000 32 5d 2c 20 26 61 5b 30 5d 29 20 29 20 72 65 74  2], &a[0]) ) ret
26010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26020 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
26030 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
26040 62 6a 76 5b 33 5d 2c 20 26 61 5b 31 5d 29 20 29  bjv[3], &a[1]) )
26050 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26060 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
26070 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
26080 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
26090 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52  FCNTL_WIN32_AV_R
260a0 45 54 52 59 2c 20 28 76 6f 69 64 2a 29 61 29 3b  ETRY, (void*)a);
260b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
260c0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
260d0 2c 20 22 25 64 20 25 64 20 25 64 22 2c 20 72 63  , "%d %d %d", rc
260e0 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20  , a[0], a[1]);. 
260f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
26100 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68  t(interp, z, (ch
26110 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
26120 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
26130 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
26140 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
26150 5f 73 65 74 5f 68 61 6e 64 6c 65 20 44 42 20 48  _set_handle DB H
26160 41 4e 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ANDLE.**.** This
26170 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
26180 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
26190 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
261a0 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65  face with.** the
261b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
261c0 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 20 6f  N32_SET_HANDLE o
261d0 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
261e0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
261f0 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64  l_win32_set_hand
26200 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  le(.  ClientData
26210 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26220 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
26230 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
26240 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
26250 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26260 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26270 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26280 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26290 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
262a0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
262b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
262c0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
262d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
262e0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
262f0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26300 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
26310 6e 74 20 72 63 3b 0a 20 20 48 41 4e 44 4c 45 20  nt rc;.  HANDLE 
26320 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hFile = NULL;.  
26330 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20  char z[100];..  
26340 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
26350 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
26360 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
26370 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
26380 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
26390 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
263a0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
263b0 30 29 2c 20 22 20 44 42 20 48 41 4e 44 4c 45 22  0), " DB HANDLE"
263c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
263d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
263e0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
263f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
26400 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
26410 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
26420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26430 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 57 69  .  }.  if( getWi
26440 6e 33 32 48 61 6e 64 6c 65 28 69 6e 74 65 72 70  n32Handle(interp
26450 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
26460 6f 62 6a 76 5b 32 5d 29 2c 20 26 68 46 69 6c 65  objv[2]), &hFile
26470 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26480 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
26490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
264a0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
264b0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
264c0 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44  L_WIN32_SET_HAND
264d0 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LE,.            
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 28 76 6f 69 64 2a 29 26 68 46 69 6c 65 29 3b 0a  (void*)&hFile);.
26500 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
26510 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
26520 20 22 25 64 20 25 70 22 2c 20 72 63 2c 20 28 76   "%d %p", rc, (v
26530 6f 69 64 2a 29 68 46 69 6c 65 29 3b 0a 20 20 54  oid*)hFile);.  T
26540 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
26550 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72  interp, z, (char
26560 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
26570 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69  CL_OK;  .}.#endi
26580 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  f../*.** tclcmd:
26590 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
265a0 70 65 72 73 69 73 74 5f 77 61 6c 20 44 42 20 50  persist_wal DB P
265b0 45 52 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a  ERSIST-FLAG.**.*
265c0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
265d0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
265e0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
265f0 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a   interface with.
26600 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ** the SQLITE_FC
26610 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 20  NTL_PERSIST_WAL 
26620 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
26630 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
26640 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 28 0a  ol_persist_wal(.
26650 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
26660 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
26670 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
26680 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
26690 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
266a0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
266b0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
266c0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
266d0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
266e0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
266f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26700 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26710 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26720 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26730 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26740 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
26750 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
26760 63 3b 0a 20 20 69 6e 74 20 62 50 65 72 73 69 73  c;.  int bPersis
26770 74 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  t;.  char z[100]
26780 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
26790 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
267a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
267b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
267c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
267d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
267e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
267f0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c  [0], 0), " DB FL
26800 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  AG", 0);.    ret
26810 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26820 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
26830 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
26840 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
26850 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
26860 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
26870 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
26880 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
26890 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
268a0 20 26 62 50 65 72 73 69 73 74 29 20 29 20 72 65   &bPersist) ) re
268b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
268c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
268d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
268e0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
268f0 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  TL_PERSIST_WAL, 
26900 28 76 6f 69 64 2a 29 26 62 50 65 72 73 69 73 74  (void*)&bPersist
26910 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
26920 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
26930 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c   z, "%d %d", rc,
26940 20 62 50 65 72 73 69 73 74 29 3b 0a 20 20 54 63   bPersist);.  Tc
26950 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
26960 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a  nterp, z, (char*
26970 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
26980 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
26990 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
269a0 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66  control_powersaf
269b0 65 5f 6f 76 65 72 77 72 69 74 65 20 44 42 20 50  e_overwrite DB P
269c0 53 4f 57 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54  SOW-FLAG.**.** T
269d0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
269e0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
269f0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
26a00 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20  terface with.** 
26a10 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
26a20 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
26a30 52 49 54 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  RITE opcode..*/.
26a40 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
26a50 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66  control_powersaf
26a60 65 5f 6f 76 65 72 77 72 69 74 65 28 0a 20 20 43  e_overwrite(.  C
26a70 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
26a80 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
26a90 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
26aa0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
26ab0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
26ac0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
26ad0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
26ae0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
26af0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
26b00 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
26b10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26b20 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
26b30 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
26b40 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
26b50 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
26b60 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
26b70 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
26b80 20 20 69 6e 74 20 62 3b 0a 20 20 63 68 61 72 20    int b;.  char 
26b90 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
26ba0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
26bb0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
26bc0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
26bd0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
26be0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
26bf0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
26c00 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
26c10 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20   DB FLAG", 0);. 
26c20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26c30 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
26c40 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
26c50 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
26c60 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
26c70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
26c80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26c90 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
26ca0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
26cb0 6a 76 5b 32 5d 2c 20 26 62 29 20 29 20 72 65 74  jv[2], &b) ) ret
26cc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
26ce0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55  le_control(db,NU
26cf0 4c 4c 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  LL,SQLITE_FCNTL_
26d00 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
26d10 49 54 45 2c 28 76 6f 69 64 2a 29 26 62 29 3b 0a  ITE,(void*)&b);.
26d20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
26d30 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
26d40 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62 29   "%d %d", rc, b)
26d50 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
26d60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
26d70 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
26d80 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
26d90 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
26da0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76    file_control_v
26db0 66 73 6e 61 6d 65 20 44 42 20 3f 41 55 58 44 42  fsname DB ?AUXDB
26dc0 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ?.**.** Return a
26dd0 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
26de0 63 72 69 62 65 73 20 74 68 65 20 73 74 61 63 6b  cribes the stack
26df0 20 6f 66 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74   of VFSes..*/.st
26e00 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
26e10 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a 20  ntrol_vfsname(. 
26e20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
26e30 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
26e40 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
26e50 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
26e60 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
26e70 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
26e80 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
26e90 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
26ea0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
26eb0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
26ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26ed0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
26ee0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
26ef0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
26f00 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
26f10 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
26f20 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
26f30 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
26f40 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a  "main";.  char *
26f50 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20  zVfsName = 0;.. 
26f60 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
26f70 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
26f80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
26f90 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
26fa0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
26fb0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
26fc0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
26fd0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
26fe0 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30  " DB ?AUXDB?", 0
26ff0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
27000 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
27010 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
27020 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
27030 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
27040 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
27050 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27060 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20  }.  if( objc==3 
27070 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d  ){.    zDbName =
27080 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
27090 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73  bjv[2]);.  }.  s
270a0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
270b0 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c  rol(db, zDbName,
270c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
270d0 53 4e 41 4d 45 2c 28 76 6f 69 64 2a 29 26 7a 56  SNAME,(void*)&zV
270e0 66 73 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41  fsName);.  Tcl_A
270f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
27100 72 70 2c 20 7a 56 66 73 4e 61 6d 65 2c 20 28 63  rp, zVfsName, (c
27110 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74  har*)0);.  sqlit
27120 65 33 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d 65  e3_free(zVfsName
27130 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
27140 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
27150 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
27160 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61  ntrol_tempfilena
27170 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a  me DB ?AUXDB?.**
27180 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
27190 69 6e 67 20 74 68 61 74 20 69 73 20 61 20 74 65  ing that is a te
271a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
271b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
271c0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70  ile_control_temp
271d0 66 69 6c 65 6e 61 6d 65 28 0a 20 20 43 6c 69 65  filename(.  Clie
271e0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
271f0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
27200 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
27210 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
27220 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27230 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
27240 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
27250 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
27260 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
27270 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
27280 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27290 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
272a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
272b0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
272c0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
272d0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
272e0 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
272f0 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  *zDbName = "main
27300 22 3b 0a 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d  ";.  char *zTNam
27310 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  e = 0;..  if( ob
27320 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
27330 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
27340 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
27350 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
27360 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
27370 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
27380 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
27390 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41  [0], 0), " DB ?A
273a0 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20  UXDB?", 0);.    
273b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
273c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
273d0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
273e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
273f0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
27400 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27410 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
27420 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
27430 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
27440 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
27450 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
27460 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
27470 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45   zDbName, SQLITE
27480 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e  _FCNTL_TEMPFILEN
27490 41 4d 45 2c 20 28 76 6f 69 64 2a 29 26 7a 54 4e  AME, (void*)&zTN
274a0 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ame);.  Tcl_Appe
274b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
274c0 20 7a 54 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29   zTName, (char*)
274d0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
274e0 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 72 65  ee(zTName);.  re
274f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
27500 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
27510 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c     sqlite3_vfs_l
27520 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75  ist.**.**   Retu
27530 72 6e 20 61 20 74 63 6c 20 6c 69 73 74 20 63 6f  rn a tcl list co
27540 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
27550 65 73 20 6f 66 20 61 6c 6c 20 72 65 67 69 73 74  es of all regist
27560 65 72 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73  ered vfs's..*/.s
27570 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 6c 69  tatic int vfs_li
27580 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
27590 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
275a0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
275b0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
275c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
275d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
275e0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
275f0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
27600 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
27610 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
27620 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
27630 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
27640 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27650 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27660 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27670 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
27680 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
27690 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  s;.  Tcl_Obj *pR
276a0 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
276b0 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  );.  if( objc!=1
276c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
276d0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
276e0 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
276f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27700 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  ROR;.  }.  for(p
27710 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  Vfs=sqlite3_vfs_
27720 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70  find(0); pVfs; p
27730 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29  Vfs=pVfs->pNext)
27740 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  {.    Tcl_ListOb
27750 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
27760 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
27770 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
27780 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b  fs->zName, -1));
27790 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
277a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
277b0 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  pRet);.  return 
277c0 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
277d0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c  ** tclcmd:   sql
277e0 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20 49 44  ite3_limit DB ID
277f0 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69   VALUE.**.** Thi
27800 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
27810 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  ns the sqlite3_l
27820 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65 20 61  imit interface a
27830 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
27840 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
27850 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f   of the same..*/
27860 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
27870 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74  _limit(.  Client
27880 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
27890 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
278a0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
278b0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
278c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
278d0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
278e0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
278f0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
27900 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
27910 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
27920 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27930 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
27940 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
27950 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
27960 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
27970 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
27980 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61  .  int rc;.  sta
27990 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
279a0 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
279b0 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64  ame;.     int id
279c0 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a  ;.  } aId[] = {.
279d0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
279e0 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  MIT_LENGTH",    
279f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
27a00 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20  _LIMIT_LENGTH   
27a10 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
27a20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
27a30 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20  IT_SQL_LENGTH", 
27a40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
27a50 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
27a60 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
27a70 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
27a80 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20  T_COLUMN",      
27a90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
27aa0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20  IMIT_COLUMN     
27ab0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
27ac0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
27ad0 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20  _EXPR_DEPTH",   
27ae0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
27af0 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20  MIT_EXPR_DEPTH  
27b00 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
27b10 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
27b20 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22  COMPOUND_SELECT"
27b30 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
27b40 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
27b50 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  CT      },.    {
27b60 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
27b70 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20  DBE_OP",        
27b80 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
27b90 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20  T_VDBE_OP       
27ba0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
27bb0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  "SQLITE_LIMIT_FU
27bc0 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20  NCTION_ARG",    
27bd0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
27be0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20  _FUNCTION_ARG   
27bf0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
27c00 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
27c10 41 43 48 45 44 22 2c 20 20 20 20 20 20 20 20 20  ACHED",         
27c20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
27c30 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20  ATTACHED        
27c40 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
27c50 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
27c60 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22  _PATTERN_LENGTH"
27c70 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  , SQLITE_LIMIT_L
27c80 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
27c90 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  TH  },.    { "SQ
27ca0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
27cb0 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20  BLE_NUMBER",    
27cc0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
27cd0 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20  RIABLE_NUMBER   
27ce0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
27cf0 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
27d00 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
27d10 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
27d20 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20  GGER_DEPTH      
27d30 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
27d40 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
27d50 54 48 52 45 41 44 53 22 2c 20 20 20 20 20 20 53  THREADS",      S
27d60 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
27d70 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20  ER_THREADS      
27d80 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   },.    .    /* 
27d90 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73  Out of range tes
27da0 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b  t cases */.    {
27db0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
27dc0 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20  OOSMALL",       
27dd0 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20       -1,        
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27df0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
27e00 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f  "SQLITE_LIMIT_TO
27e10 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20 20 20  OBIG",          
27e20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
27e30 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2b  _WORKER_THREADS+
27e40 31 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20  1     },.  };.  
27e50 69 6e 74 20 69 2c 20 69 64 20 3d 20 30 3b 0a 20  int i, id = 0;. 
27e60 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73   int val;.  cons
27e70 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20  t char *zId;..  
27e80 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
27e90 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
27ea0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
27eb0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
27ec0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
27ed0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
27ee0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
27ef0 30 29 2c 20 22 20 44 42 20 49 44 20 56 41 4c 55  0), " DB ID VALU
27f00 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
27f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27f20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
27f30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
27f40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27f50 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
27f60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27f70 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zId = Tcl_GetStr
27f80 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
27f90 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
27fa0 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
27fb0 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
27fc0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49 64 2c   if( strcmp(zId,
27fd0 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d   aId[i].zName)==
27fe0 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20 3d 20  0 ){.      id = 
27ff0 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20  aId[i].id;.     
28000 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28010 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
28020 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
28030 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  d[0]) ){.    Tcl
28040 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
28050 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c  terp, "unknown l
28060 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20 7a 49  imit type: ", zI
28070 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  d, (char*)0);.  
28080 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28090 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
280a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
280b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
280c0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
280d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
280e0 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  = sqlite3_limit(
280f0 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20  db, id, val);.  
28100 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
28110 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
28120 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  IntObj(rc));.  r
28130 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
28140 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
28150 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74    save_prng_stat
28160 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  e.**.** Save the
28170 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 73   state of the ps
28180 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62  eudo-random numb
28190 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a  er generator..**
281a0 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
281b0 65 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 73  e, verify that s
281c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
281d0 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20 77  rol works even w
281e0 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  hen.** called wi
281f0 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e  th an out-of-ran
28200 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  ge opcode..*/.st
28210 61 74 69 63 20 69 6e 74 20 73 61 76 65 5f 70 72  atic int save_pr
28220 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
28230 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28240 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
28250 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
28260 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
28270 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28280 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28290 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
282a0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
282b0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
282c0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
282d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
282e0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
282f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28300 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
28310 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
28320 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  .){.  int rc = s
28330 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
28340 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73  rol(9999);.  ass
28350 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
28360 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
28370 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20  t_control(-1);. 
28380 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
28390 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  ;.  sqlite3_test
283a0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
283b0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
283c0 56 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  VE);.  return TC
283d0 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
283e0 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70  lcmd:  restore_p
283f0 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
28400 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72 65 5f  tic int restore_
28410 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
28420 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
28430 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
28440 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
28450 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
28460 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
28470 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
28480 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
28490 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
284a0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
284b0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
284c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
284d0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
284e0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
284f0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
28500 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
28510 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
28520 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
28530 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
28540 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20 20 72 65  G_RESTORE);.  re
28550 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
28560 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65  *.** tclcmd:  re
28570 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  set_prng_state.*
28580 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
28590 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20  et_prng_state(. 
285a0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
285b0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
285c0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
285d0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
285e0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
285f0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
28600 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
28610 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
28620 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
28630 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
28640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
28650 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
28660 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
28670 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
28680 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
28690 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
286a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
286b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
286c0 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a 20 20 72  PRNG_RESET);.  r
286d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
286e0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
286f0 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f  database_may_be_
28700 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e  corrupt.**.** In
28710 64 69 63 61 74 65 20 74 68 61 74 20 64 61 74 61  dicate that data
28720 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
28730 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   be corrupt.  In
28740 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 65   other words, se
28750 74 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  t the normal.** 
28760 73 74 61 74 65 20 6f 66 20 6f 70 65 72 61 74 69  state of operati
28770 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
28780 74 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62  t database_may_b
28790 65 5f 63 6f 72 72 75 70 74 28 0a 20 20 43 6c 69  e_corrupt(.  Cli
287a0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
287b0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
287c0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
287d0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
287e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
287f0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
28800 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
28810 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
28820 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
28830 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
28840 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28850 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
28860 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
28870 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
28880 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
28890 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74  /.){.  sqlite3_t
288a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
288b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
288c0 52 5f 43 4f 52 52 55 50 54 2c 20 30 29 3b 0a 20  R_CORRUPT, 0);. 
288d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
288e0 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
288f0 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f   database_never_
28900 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e  corrupt.**.** In
28910 64 69 63 61 74 65 20 74 68 61 74 20 64 61 74 61  dicate that data
28920 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 61  base files are a
28930 6c 77 61 79 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  lways well-forme
28940 64 2e 20 20 54 68 69 73 20 65 6e 61 62 6c 65 73  d.  This enables
28950 20 65 78 74 72 61 20 61 73 73 65 72 74 28 29 0a   extra assert().
28960 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ** statements th
28970 61 74 20 74 65 73 74 20 63 6f 6e 64 69 74 69 6f  at test conditio
28980 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61  ns that are alwa
28990 79 73 20 74 72 75 65 20 66 6f 72 20 77 65 6c 6c  ys true for well
289a0 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
289b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
289c0 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f   database_never_
289d0 63 6f 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e  corrupt(.  Clien
289e0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
289f0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
28a00 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
28a10 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
28a20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28a30 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28a40 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28a50 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28a60 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28a70 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
28a80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28a90 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
28aa0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
28ab0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
28ac0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28ad0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73  ){.  sqlite3_tes
28ae0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
28af0 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
28b00 43 4f 52 52 55 50 54 2c 20 31 29 3b 0a 20 20 72  CORRUPT, 1);.  r
28b10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
28b20 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
28b30 70 63 61 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a  pcache_stats.*/.
28b40 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
28b50 70 63 61 63 68 65 5f 73 74 61 74 73 28 0a 20 20  pcache_stats(.  
28b60 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
28b70 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
28b80 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
28b90 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
28ba0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
28bb0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
28bc0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
28bd0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
28be0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
28bf0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
28c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28c10 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
28c20 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
28c30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
28c40 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
28c50 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d  s */.){.  int nM
28c60 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  in;.  int nMax;.
28c70 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 3b 0a    int nCurrent;.
28c80 20 20 69 6e 74 20 6e 52 65 63 79 63 6c 61 62 6c    int nRecyclabl
28c90 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  e;.  Tcl_Obj *pR
28ca0 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 63  et;..  sqlite3Pc
28cb0 61 63 68 65 53 74 61 74 73 28 26 6e 43 75 72 72  acheStats(&nCurr
28cc0 65 6e 74 2c 20 26 6e 4d 61 78 2c 20 26 6e 4d 69  ent, &nMax, &nMi
28cd0 6e 2c 20 26 6e 52 65 63 79 63 6c 61 62 6c 65 29  n, &nRecyclable)
28ce0 3b 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  ;..  pRet = Tcl_
28cf0 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
28d00 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
28d10 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
28d20 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
28d30 4f 62 6a 28 22 63 75 72 72 65 6e 74 22 2c 20 2d  Obj("current", -
28d40 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
28d50 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
28d60 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
28d70 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 75 72  l_NewIntObj(nCur
28d80 72 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  rent));.  Tcl_Li
28d90 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
28da0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
28db0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
28dc0 6a 28 22 6d 61 78 22 2c 20 2d 31 29 29 3b 0a 20  j("max", -1));. 
28dd0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
28de0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
28df0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
28e00 6e 74 4f 62 6a 28 6e 4d 61 78 29 29 3b 0a 20 20  ntObj(nMax));.  
28e10 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
28e20 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
28e30 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
28e40 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d  ringObj("min", -
28e50 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
28e60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
28e70 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
28e80 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e  l_NewIntObj(nMin
28e90 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
28ea0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
28eb0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
28ec0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72  _NewStringObj("r
28ed0 65 63 79 63 6c 61 62 6c 65 22 2c 20 2d 31 29 29  ecyclable", -1))
28ee0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
28ef0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
28f00 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
28f10 65 77 49 6e 74 4f 62 6a 28 6e 52 65 63 79 63 6c  ewIntObj(nRecycl
28f20 61 62 6c 65 29 29 3b 0a 0a 20 20 54 63 6c 5f 53  able));..  Tcl_S
28f30 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
28f40 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65  rp, pRet);..  re
28f50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
28f60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
28f70 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
28f80 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  FY.static void t
28f90 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
28fa0 79 5f 63 62 28 76 6f 69 64 20 2a 2a 61 41 72 67  y_cb(void **aArg
28fb0 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69  , int nArg){.  i
28fc0 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d  nt ii;.  for(ii=
28fd0 30 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b  0; ii<nArg; ii++
28fe0 29 7b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 45  ){.    Tcl_EvalE
28ff0 78 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  x((Tcl_Interp *)
29000 61 41 72 67 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63  aArg[ii], "unloc
29010 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d 31 2c 20 54  k_notify", -1, T
29020 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
29030 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
29040 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
29050 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a  NLOCK_NOTIFY */.
29060 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
29070 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
29080 6f 74 69 66 79 20 64 62 0a 2a 2f 0a 23 69 66 64  otify db.*/.#ifd
29090 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
290a0 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
290b0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75  tatic int test_u
290c0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 0a 20 20  nlock_notify(.  
290d0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
290e0 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
290f0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
29100 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
29110 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
29120 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
29130 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
29140 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
29150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29160 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
29170 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
29180 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
29190 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
291a0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
291b0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
291c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
291d0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
291e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
291f0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
29200 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29210 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
29220 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
29230 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
29240 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
29250 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
29260 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
29280 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 64 62 2c  nlock_notify(db,
29290 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
292a0 69 66 79 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29  ify_cb, (void *)
292b0 69 6e 74 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53  interp);.  Tcl_S
292c0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
292d0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
292e0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
292f0 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
29300 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
29310 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
29320 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
29330 63 6b 70 6f 69 6e 74 20 64 62 20 3f 4e 41 4d 45  ckpoint db ?NAME
29340 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ?.*/.static int 
29350 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  test_wal_checkpo
29360 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  int(.  ClientDat
29370 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
29380 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
29390 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
293a0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
293b0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
293c0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
293d0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
293e0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
293f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
29400 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
29410 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
29420 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
29430 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
29440 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a   char *zDb = 0;.
29450 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
29460 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
29470 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
29480 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
29490 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
294a0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
294b0 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65  ?NAME?");.    re
294c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
294d0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
294e0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
294f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
29500 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
29510 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29520 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
29530 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a  objc==3 ){.    z
29540 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
29550 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d  ng(objv[2]);.  }
29560 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
29570 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64  wal_checkpoint(d
29580 62 2c 20 7a 44 62 29 3b 0a 20 20 54 63 6c 5f 53  b, zDb);.  Tcl_S
29590 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
295a0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
295b0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
295c0 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
295d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
295e0 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
295f0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
29600 5f 76 32 20 64 62 20 4d 4f 44 45 20 3f 4e 41 4d  _v2 db MODE ?NAM
29610 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  E?.**.** This co
29620 6d 6d 61 6e 64 20 63 61 6c 6c 73 20 74 68 65 20  mmand calls the 
29630 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
29640 32 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  2() function wit
29650 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  h the specified.
29660 2a 2a 20 6d 6f 64 65 20 61 72 67 75 6d 65 6e 74  ** mode argument
29670 20 28 70 61 73 73 69 76 65 2c 20 66 75 6c 6c 20   (passive, full 
29680 6f 72 20 72 65 73 74 61 72 74 29 2e 20 49 66 20  or restart). If 
29690 70 72 65 73 65 6e 74 2c 20 74 68 65 20 64 61 74  present, the dat
296a0 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 4e 41  abase name.** NA
296b0 4d 45 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ME is passed as 
296c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
296d0 65 6e 74 20 74 6f 20 77 61 6c 5f 63 68 65 63 6b  ent to wal_check
296e0 70 6f 69 6e 74 5f 76 32 28 29 2e 20 49 66 20 69  point_v2(). If i
296f0 74 20 74 68 65 0a 2a 2a 20 4e 41 4d 45 20 61 72  t the.** NAME ar
29700 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  gument is not pr
29710 65 73 65 6e 74 2c 20 61 20 4e 55 4c 4c 20 70 6f  esent, a NULL po
29720 69 6e 74 65 72 20 69 73 20 70 61 73 73 65 64 20  inter is passed 
29730 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
29740 66 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  f wal_checkpoint
29750 5f 76 32 28 29 20 72 65 74 75 72 6e 73 20 61 6e  _v2() returns an
29760 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74 68  y value other th
29770 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  an SQLITE_BUSY o
29780 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  r.** SQLITE_OK, 
29790 74 68 65 6e 20 74 68 69 73 20 63 6f 6d 6d 61 6e  then this comman
297a0 64 20 72 65 74 75 72 6e 73 20 54 43 4c 5f 45 52  d returns TCL_ER
297b0 52 4f 52 2e 20 54 68 65 20 54 63 6c 20 72 65 73  ROR. The Tcl res
297c0 75 6c 74 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  ult is set.** to
297d0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
297e0 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
297f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
29800 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
29810 73 65 2c 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  se, this command
29820 20 72 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20   returns a list 
29830 6f 66 20 74 68 72 65 65 20 69 6e 74 65 67 65 72  of three integer
29840 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  s. The first int
29850 65 67 65 72 0a 2a 2a 20 69 73 20 31 20 69 66 20  eger.** is 1 if 
29860 53 51 4c 49 54 45 5f 42 55 53 59 20 77 61 73 20  SQLITE_BUSY was 
29870 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 30 20 6f  returned, or 0 o
29880 74 68 65 72 77 69 73 65 2e 20 54 68 65 20 66 6f  therwise. The fo
29890 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 69 6e 74 65  llowing two inte
298a0 67 65 72 73 0a 2a 2a 20 61 72 65 20 74 68 65 20  gers.** are the 
298b0 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
298c0 76 69 61 20 74 68 65 20 6f 75 74 70 75 74 20 70  via the output p
298d0 61 72 61 6d 65 74 65 72 73 20 62 79 20 77 61 6c  arameters by wal
298e0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
298f0 20 2d 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72   -.** the number
29900 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
29910 65 20 6c 6f 67 20 61 6e 64 20 74 68 65 20 6e 75  e log and the nu
29920 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
29930 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a 20 74 68 61  n the log.** tha
29940 74 20 68 61 76 65 20 62 65 65 6e 20 63 68 65 63  t have been chec
29950 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61  kpointed..*/.sta
29960 74 69 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c  tic int test_wal
29970 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a  _checkpoint_v2(.
29980 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
29990 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
299a0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
299b0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
299c0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
299d0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
299e0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
299f0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
29a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29a10 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
29a20 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
29a30 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
29a40 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
29a50 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
29a60 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c   *zDb = 0;.  sql
29a70 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
29a80 72 63 3b 0a 0a 20 20 69 6e 74 20 65 4d 6f 64 65  rc;..  int eMode
29a90 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d  ;.  int nLog = -
29aa0 35 35 35 3b 0a 20 20 69 6e 74 20 6e 43 6b 70 74  555;.  int nCkpt
29ab0 20 3d 20 2d 35 35 35 3b 0a 20 20 54 63 6c 5f 4f   = -555;.  Tcl_O
29ac0 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e  bj *pRet;..  con
29ad0 73 74 20 63 68 61 72 20 2a 20 61 4d 6f 64 65 5b  st char * aMode[
29ae0 5d 20 3d 20 7b 20 22 70 61 73 73 69 76 65 22 2c  ] = { "passive",
29af0 20 22 66 75 6c 6c 22 2c 20 22 72 65 73 74 61 72   "full", "restar
29b00 74 22 2c 20 22 74 72 75 6e 63 61 74 65 22 2c 20  t", "truncate", 
29b10 30 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 53  0 };.  assert( S
29b20 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
29b30 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20  _PASSIVE==0 );. 
29b40 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
29b50 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d  CHECKPOINT_FULL=
29b60 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
29b70 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
29b80 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a  T_RESTART==2 );.
29b90 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
29ba0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
29bb0 43 41 54 45 3d 3d 33 20 29 3b 0a 0a 20 20 69 66  CATE==3 );..  if
29bc0 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
29bd0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
29be0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
29bf0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
29c00 42 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b  B MODE ?NAME?");
29c10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29c20 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
29c30 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
29c40 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
29c50 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
29c60 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
29c70 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
29c80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
29c90 5b 31 5d 29 2c 20 26 64 62 29 20 7c 7c 20 28 0a  [1]), &db) || (.
29ca0 20 20 20 20 20 20 54 43 4c 5f 4f 4b 21 3d 54 63        TCL_OK!=Tc
29cb0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
29cc0 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 4d 6f  0, objv[2], &eMo
29cd0 64 65 29 0a 20 20 20 26 26 20 54 43 4c 5f 4f 4b  de).   && TCL_OK
29ce0 21 3d 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  !=Tcl_GetIndexFr
29cf0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
29d00 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d  jv[2], aMode, "m
29d10 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29  ode", 0, &eMode)
29d20 20 0a 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75   .  )){.    retu
29d30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29d40 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
29d50 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
29d60 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f  _v2(db, zDb, eMo
29d70 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70  de, &nLog, &nCkp
29d80 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
29d90 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
29da0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
29db0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
29dc0 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  rrCode = sqlite3
29dd0 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20  ErrName(rc);.   
29de0 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
29df0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
29e00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
29e10 6e 74 65 72 70 2c 20 7a 45 72 72 43 6f 64 65 2c  nterp, zErrCode,
29e20 20 22 20 2d 20 22 2c 20 28 63 68 61 72 20 2a 29   " - ", (char *)
29e30 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
29e40 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
29e50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29e60 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  }..  pRet = Tcl_
29e70 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
29e80 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
29e90 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
29ea0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
29eb0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  (rc==SQLITE_BUSY
29ec0 3f 31 3a 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  ?1:0));.  Tcl_Li
29ed0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
29ee0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
29ef0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
29f00 4c 6f 67 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Log));.  Tcl_Lis
29f10 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
29f20 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
29f30 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43  Tcl_NewIntObj(nC
29f40 6b 70 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74  kpt));.  Tcl_Set
29f50 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
29f60 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75  , pRet);..  retu
29f70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
29f80 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
29f90 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
29fa0 63 6b 70 6f 69 6e 74 20 64 62 20 56 41 4c 55 45  ckpoint db VALUE
29fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
29fc0 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  est_wal_autochec
29fd0 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74  kpoint(.  Client
29fe0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
29ff0 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
2a000 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a010 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2a020 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2a030 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2a040 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2a050 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2a060 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a070 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2a080 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2a090 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2a0a0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2a0b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2a0c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2a0d0 20 69 56 61 6c 3b 0a 0a 0a 20 20 69 66 28 20 6f   iVal;...  if( o
2a0e0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
2a0f0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2a100 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2a110 22 44 42 20 56 41 4c 55 45 22 29 3b 0a 20 20 20  "DB VALUE");.   
2a120 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a130 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
2a140 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2a150 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2a160 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2a170 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  .   || Tcl_GetIn
2a180 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76  tFromObj(0, objv
2a190 5b 32 5d 2c 20 26 69 56 61 6c 29 0a 20 20 29 7b  [2], &iVal).  ){
2a1a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2a1b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63  ERROR;.  }..  rc
2a1c0 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61   = sqlite3_wal_a
2a1d0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
2a1e0 2c 20 69 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 52  , iVal);.  Tcl_R
2a1f0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
2a200 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
2a210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
2a220 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 43  onst char *zErrC
2a230 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 45 72 72  ode = sqlite3Err
2a240 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20 20 54 63  Name(rc);.    Tc
2a250 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2a260 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
2a270 72 69 6e 67 4f 62 6a 28 7a 45 72 72 43 6f 64 65  ringObj(zErrCode
2a280 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75  , -1));.    retu
2a290 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a2a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
2a2b0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
2a2c0 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c 69  lcmd:  test_sqli
2a2d0 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f  te3_log ?SCRIPT?
2a2e0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
2a2f0 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a  t LogCallback {.
2a300 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49    Tcl_Interp *pI
2a310 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
2a320 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c   *pObj;.} logcal
2a330 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a  lback = {0, 0};.
2a340 73 74 61 74 69 63 20 76 6f 69 64 20 78 4c 6f 67  static void xLog
2a350 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75  callback(void *u
2a360 6e 75 73 65 64 2c 20 69 6e 74 20 65 72 72 2c 20  nused, int err, 
2a370 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54  char *zMsg){.  T
2a380 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54  cl_Obj *pNew = T
2a390 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
2a3a0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
2a3b0 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
2a3c0 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54  Count(pNew);.  T
2a3d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2a3e0 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 30  Element(.      0
2a3f0 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53  , pNew, Tcl_NewS
2a400 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
2a410 45 72 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31  ErrName(err), -1
2a420 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ).  );.  Tcl_Lis
2a430 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2a440 74 28 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e  t(0, pNew, Tcl_N
2a450 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67  ewStringObj(zMsg
2a460 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
2a470 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62  alObjEx(logcallb
2a480 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65  ack.pInterp, pNe
2a490 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  w, TCL_EVAL_GLOB
2a4a0 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  AL|TCL_EVAL_DIRE
2a4b0 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
2a4c0 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d  efCount(pNew);.}
2a4d0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2a4e0 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20  _sqlite3_log(.  
2a4f0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2a500 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2a510 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2a520 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2a530 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2a540 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2a550 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a570 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2a580 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2a590 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2a5a0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2a5b0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ents */.){.  if(
2a5c0 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54   objc>2 ){.    T
2a5d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2a5e0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2a5f0 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20   "SCRIPT");.    
2a600 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a610 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63  ;.  }.  if( logc
2a620 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a  allback.pObj ){.
2a630 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2a640 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  ount(logcallback
2a650 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63  .pObj);.    logc
2a660 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30  allback.pObj = 0
2a670 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63  ;.    logcallbac
2a680 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20  k.pInterp = 0;. 
2a690 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69     sqlite3_confi
2a6a0 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
2a6b0 4c 4f 47 2c 20 28 76 6f 69 64 2a 29 30 2c 20 28  LOG, (void*)0, (
2a6c0 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  void*)0);.  }.  
2a6d0 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
2a6e0 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f    logcallback.pO
2a6f0 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20  bj = objv[1];.  
2a700 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2a710 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  nt(logcallback.p
2a720 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c  Obj);.    logcal
2a730 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20  lback.pInterp = 
2a740 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69  interp;.    sqli
2a750 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
2a760 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c  E_CONFIG_LOG, xL
2a770 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  ogcallback, (voi
2a780 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  d*)0);.  }.  ret
2a790 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2a7a0 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a  *.**     tcl_obj
2a7b0 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45  proc COMMANDNAME
2a7c0 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52   ARGS....**.** R
2a7d0 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  un a TCL command
2a7e0 20 75 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72   using its objPr
2a7f0 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54  oc interface.  T
2a800 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
2a810 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  .** the command 
2a820 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69  has no objProc i
2a830 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
2a840 74 69 63 20 69 6e 74 20 72 75 6e 41 73 4f 62 6a  tic int runAsObj
2a850 50 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  Proc(.  void * c
2a860 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2a870 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a880 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2a890 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2a8a0 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  jv[].){.  Tcl_Cm
2a8b0 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
2a8c0 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
2a8d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2a8e0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2a8f0 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e  bjv, "COMMAND ..
2a900 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
2a910 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2a920 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d   if( !Tcl_GetCom
2a930 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
2a940 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2a950 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66  bjv[1]), &cmdInf
2a960 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
2a970 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2a980 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20  p, "command not 
2a990 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20  found: ",.      
2a9a0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
2a9b0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68  ng(objv[1]), (ch
2a9c0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2a9d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a9e0 7d 0a 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e  }.  if( cmdInfo.
2a9f0 6f 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20  objProc==0 ){.  
2aa00 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2aa10 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d  lt(interp, "comm
2aa20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72  and has no objPr
2aa30 6f 63 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  oc: ",.         
2aa40 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
2aa50 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
2aa60 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
2aa70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2aa80 20 72 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e   return cmdInfo.
2aa90 6f 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e  objProc(cmdInfo.
2aaa0 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69  objClientData, i
2aab0 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f  nterp, objc-1, o
2aac0 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64  bjv+1);.}..#ifnd
2aad0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2aae0 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52  XPLAIN./*.** WAR
2aaf0 4e 49 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77  NING: The follow
2ab00 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72  ing function, pr
2ab10 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
2ab20 6c 61 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63  lan() is an exac
2ab30 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61  t.** copy of exa
2ab40 6d 70 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65  mple code from e
2ab50 71 70 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29  qp.in (eqp.html)
2ab60 2e 20 49 66 20 74 68 69 73 20 63 6f 64 65 20 69  . If this code i
2ab70 73 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74  s modified,.** t
2ab80 68 65 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  hen the document
2ab90 61 74 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73  ation copy needs
2aba0 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20   to be modified 
2abb0 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a  as well..*/./*.*
2abc0 2a 20 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74  * Argument pStmt
2abd0 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 53   is a prepared S
2abe0 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  QL statement. Th
2abf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
2ac00 69 6c 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41  iles.** an EXPLA
2ac10 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2ac20 6d 6d 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20  mmand to report 
2ac30 6f 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  on the prepared 
2ac40 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e  statement,.** an
2ac50 64 20 70 72 69 6e 74 73 20 74 68 65 20 72 65 70  d prints the rep
2ac60 6f 72 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73  ort to stdout us
2ac70 69 6e 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  ing printf()..*/
2ac80 0a 69 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69  .int printExplai
2ac90 6e 51 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74  nQueryPlan(sqlit
2aca0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
2acb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2acc0 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
2acd0 20 20 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20     /* Input SQL 
2ace0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c  */.  char *zExpl
2acf0 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ain;            
2ad00 20 20 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68       /* SQL with
2ad10 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
2ad20 4c 41 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f  LAN prepended */
2ad30 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2ad40 2a 70 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20  *pExplain;      
2ad50 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45     /* Compiled E
2ad60 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
2ad70 4e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  N command */.  i
2ad80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ada0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
2adb0 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  om sqlite3_prepa
2adc0 72 65 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53  re_v2() */..  zS
2add0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c  ql = sqlite3_sql
2ade0 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a  (pStmt);.  if( z
2adf0 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
2ae00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
2ae10 20 7a 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69   zExplain = sqli
2ae20 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50  te3_mprintf("EXP
2ae30 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2ae40 25 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66  %s", zSql);.  if
2ae50 28 20 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20  ( zExplain==0 ) 
2ae60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ae70 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  MEM;..  rc = sql
2ae80 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2ae90 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
2aea0 65 28 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61  e(pStmt), zExpla
2aeb0 69 6e 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  in, -1, &pExplai
2aec0 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 0);.  sqlite3
2aed0 5f 66 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b  _free(zExplain);
2aee0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2aef0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2af00 3b 0a 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49  ;..  while( SQLI
2af10 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2af20 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29  step(pExplain) )
2af30 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63  {.    int iSelec
2af40 74 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tid = sqlite3_co
2af50 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
2af60 6e 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69  n, 0);.    int i
2af70 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f  Order = sqlite3_
2af80 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
2af90 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74  ain, 1);.    int
2afa0 20 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33   iFrom = sqlite3
2afb0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
2afc0 6c 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f  lain, 2);.    co
2afd0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69  nst char *zDetai
2afe0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  l = (const char 
2aff0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2b000 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20  _text(pExplain, 
2b010 33 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28  3);..    printf(
2b020 22 25 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c  "%d %d %d %s\n",
2b030 20 69 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64   iSelectid, iOrd
2b040 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61  er, iFrom, zDeta
2b050 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  il);.  }..  retu
2b060 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  rn sqlite3_final
2b070 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d  ize(pExplain);.}
2b080 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
2b090 74 5f 70 72 69 6e 74 5f 65 71 70 28 0a 20 20 76  t_print_eqp(.  v
2b0a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
2b0b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2b0c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2b0d0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2b0e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2b0f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2b100 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
2b110 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2b120 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2b130 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2b140 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
2b150 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2b160 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2b170 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
2b180 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2b190 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2b1a0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
2b1b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
2b1c0 20 3d 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51   = printExplainQ
2b1d0 75 65 72 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b  ueryPlan(pStmt);
2b1e0 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 65  .  /* This is ne
2b1f0 65 64 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20  eded on Windows 
2b200 73 6f 20 74 68 61 74 20 61 20 74 65 73 74 20 63  so that a test c
2b210 61 73 65 20 75 73 69 6e 67 20 74 68 69 73 20 0a  ase using this .
2b220 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61    ** function ca
2b230 6e 20 6f 70 65 6e 20 61 20 72 65 61 64 20 70 69  n open a read pi
2b240 70 65 20 61 6e 64 20 67 65 74 20 74 68 65 20 6f  pe and get the o
2b250 75 74 70 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72  utput of.  ** pr
2b260 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
2b270 6c 61 6e 28 29 20 69 6d 6d 65 64 69 61 74 65 6c  lan() immediatel
2b280 79 2e 0a 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68  y..  */.  fflush
2b290 28 73 74 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f  (stdout);.  Tcl_
2b2a0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2b2b0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
2b2c0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
2b2d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2b2e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2b2f0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
2b300 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  */../*.** sqlite
2b310 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56  3_test_control V
2b320 45 52 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73  ERB ARGS....*/.s
2b330 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74  tatic int test_t
2b340 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76  est_control(.  v
2b350 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
2b360 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2b370 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2b380 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2b390 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2b3a0 20 73 74 72 75 63 74 20 56 65 72 62 20 7b 0a 20   struct Verb {. 
2b3b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b3c0 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Name;.    int i;
2b3d0 0a 20 20 7d 20 61 56 65 72 62 5b 5d 20 3d 20 7b  .  } aVerb[] = {
2b3e0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54  .    { "SQLITE_T
2b3f0 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
2b400 45 5f 46 41 55 4c 54 22 2c 20 53 51 4c 49 54 45  E_FAULT", SQLITE
2b410 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
2b420 49 4d 45 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20  IME_FAULT }, .  
2b430 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54    { "SQLITE_TEST
2b440 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
2b450 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45  ",     SQLITE_TE
2b460 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d  STCTRL_SORTER_MM
2b470 41 50 20 20 20 20 20 7d 2c 20 0a 20 20 20 20 7b  AP     }, .    {
2b480 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
2b490 4c 5f 49 4d 50 4f 53 54 45 52 22 2c 20 20 20 20  L_IMPOSTER",    
2b4a0 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
2b4b0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 20 20 20  TRL_IMPOSTER    
2b4c0 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
2b4d0 74 20 69 56 65 72 62 3b 0a 20 20 69 6e 74 20 69  t iVerb;.  int i
2b4e0 46 6c 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Flag;.  int rc;.
2b4f0 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
2b500 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2b510 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2b520 20 6f 62 6a 76 2c 20 22 56 45 52 42 20 41 52 47   objv, "VERB ARG
2b530 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75  S...");.    retu
2b540 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b550 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  }..  rc = Tcl_Ge
2b560 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
2b570 75 63 74 28 0a 20 20 20 20 20 20 69 6e 74 65 72  uct(.      inter
2b580 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72  p, objv[1], aVer
2b590 62 2c 20 73 69 7a 65 6f 66 28 61 56 65 72 62 5b  b, sizeof(aVerb[
2b5a0 30 5d 29 2c 20 22 56 45 52 42 22 2c 20 30 2c 20  0]), "VERB", 0, 
2b5b0 26 69 56 65 72 62 0a 20 20 29 3b 0a 20 20 69 66  &iVerb.  );.  if
2b5c0 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
2b5d0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c  eturn rc;..  iFl
2b5e0 61 67 20 3d 20 61 56 65 72 62 5b 69 56 65 72 62  ag = aVerb[iVerb
2b5f0 5d 2e 69 3b 0a 20 20 73 77 69 74 63 68 28 20 69  ].i;.  switch( i
2b600 46 6c 61 67 20 29 7b 0a 20 20 20 20 63 61 73 65  Flag ){.    case
2b610 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2b620 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
2b630 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61  : {.      int va
2b640 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  l;.      if( obj
2b650 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
2b660 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2b670 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
2b680 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20  , "ONOFF");.    
2b690 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2b6a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
2b6b0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
2b6c0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
2b6d0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
2b6e0 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
2b6f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73  L_ERROR;.      s
2b700 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2b710 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2b720 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
2b730 55 4c 54 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20  ULT, val);.     
2b740 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
2b750 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
2b760 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
2b770 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  MAP: {.      int
2b780 20 76 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69   val;.      sqli
2b790 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20 20 69  te3 *db;.      i
2b7a0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
2b7b0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
2b7c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
2b7d0 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4c 49 4d 49  , objv, "DB LIMI
2b7e0 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  T");.        ret
2b7f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b810 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2b820 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2b830 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64  ing(objv[2]), &d
2b840 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2b850 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
2b860 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2b870 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2b880 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  3], &val) ) retu
2b890 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b8a0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
2b8b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2b8c0 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
2b8d0 4d 4d 41 50 2c 20 64 62 2c 20 76 61 6c 29 3b 0a  MMAP, db, val);.
2b8e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b8f0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
2b900 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
2b910 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  OSTER: {.      i
2b920 6e 74 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 3b 0a  nt onOff, tnum;.
2b930 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b940 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 20 20 20   *zDbName;.     
2b950 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2b960 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 36 20      if( objc!=6 
2b970 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
2b980 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2b990 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 2, objv, "DB
2b9a0 20 64 62 4e 61 6d 65 20 6f 6e 4f 66 66 20 74 6e   dbName onOff tn
2b9b0 75 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  um");.        re
2b9c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2b9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b9e0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2b9f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2ba00 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
2ba10 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2ba20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7a 44  _ERROR;.      zD
2ba30 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
2ba40 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
2ba50 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
2ba60 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2ba70 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6f 6e  rp, objv[4], &on
2ba80 4f 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43  Off) ) return TC
2ba90 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
2baa0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
2bab0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2bac0 76 5b 35 5d 2c 20 26 74 6e 75 6d 29 20 29 20 72  v[5], &tnum) ) r
2bad0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2bae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
2baf0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2bb00 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
2bb10 53 54 45 52 2c 20 64 62 2c 20 7a 44 62 4e 61 6d  STER, db, zDbNam
2bb20 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b  e, onOff, tnum);
2bb30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2bb40 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52    }.  }..  Tcl_R
2bb50 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
2bb60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
2bb70 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
2bb80 54 45 5f 4f 53 5f 55 4e 49 58 0a 23 69 6e 63 6c  TE_OS_UNIX.#incl
2bb90 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
2bba0 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
2bbb0 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 73 74 61 74  esource.h>..stat
2bbc0 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 72  ic int test_getr
2bbd0 75 73 61 67 65 28 0a 20 20 76 6f 69 64 20 2a 20  usage(.  void * 
2bbe0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2bbf0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2bc00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2bc10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2bc20 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20  bjv[].){.  char 
2bc30 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74 72  buf[1024];.  str
2bc40 75 63 74 20 72 75 73 61 67 65 20 72 3b 0a 20 20  uct rusage r;.  
2bc50 6d 65 6d 73 65 74 28 26 72 2c 20 30 2c 20 73 69  memset(&r, 0, si
2bc60 7a 65 6f 66 28 72 29 29 3b 0a 20 20 67 65 74 72  zeof(r));.  getr
2bc70 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c  usage(RUSAGE_SEL
2bc80 46 2c 20 26 72 29 3b 0a 0a 20 20 73 71 6c 69 74  F, &r);..  sqlit
2bc90 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2bca0 6f 66 28 62 75 66 29 2c 20 62 75 66 2c 0a 20 20  of(buf), buf,.  
2bcb0 20 20 22 72 75 5f 75 74 69 6d 65 3d 25 64 2e 25    "ru_utime=%d.%
2bcc0 30 36 64 20 72 75 5f 73 74 69 6d 65 3d 25 64 2e  06d ru_stime=%d.
2bcd0 25 30 36 64 20 72 75 5f 6d 69 6e 66 6c 74 3d 25  %06d ru_minflt=%
2bce0 64 20 72 75 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c  d ru_majflt=%d",
2bcf0 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f   .    (int)r.ru_
2bd00 75 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69  utime.tv_sec, (i
2bd10 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76  nt)r.ru_utime.tv
2bd20 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74  _usec, .    (int
2bd30 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 73  )r.ru_stime.tv_s
2bd40 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 73 74  ec, (int)r.ru_st
2bd50 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20  ime.tv_usec, .  
2bd60 20 20 28 69 6e 74 29 72 2e 72 75 5f 6d 69 6e 66    (int)r.ru_minf
2bd70 6c 74 2c 20 28 69 6e 74 29 72 2e 72 75 5f 6d 61  lt, (int)r.ru_ma
2bd80 6a 66 6c 74 0a 20 20 29 3b 0a 20 20 54 63 6c 5f  jflt.  );.  Tcl_
2bd90 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2bda0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
2bdb0 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b  ngObj(buf, -1));
2bdc0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2bdd0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
2bde0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a  SQLITE_OS_WIN./*
2bdf0 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
2be00 70 61 73 73 65 64 20 66 72 6f 6d 20 74 68 65 20  passed from the 
2be10 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 74 6f  main thread into
2be20 20 74 68 65 20 77 69 6e 64 6f 77 73 20 66 69 6c   the windows fil
2be30 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63 6b  e locker.** back
2be40 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a 2a  ground thread..*
2be50 2f 0a 73 74 72 75 63 74 20 77 69 6e 33 32 46 69  /.struct win32Fi
2be60 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68 61  leLocker {.  cha
2be70 72 20 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20 20  r *evName;      
2be80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65 6e   /* Name of even
2be90 74 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 72 65  t to signal thre
2bea0 61 64 20 73 74 61 72 74 75 70 20 2a 2f 0a 20 20  ad startup */.  
2beb0 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
2bec0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 66      /* Handle of
2bed0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2bee0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  locked */.  int 
2bef0 64 65 6c 61 79 31 3b 20 20 20 20 20 20 20 20 20  delay1;         
2bf00 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20  /* Delay before 
2bf10 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  locking */.  int
2bf20 20 64 65 6c 61 79 32 3b 20 20 20 20 20 20 20 20   delay2;        
2bf30 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65   /* Delay before
2bf40 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20   unlocking */.  
2bf50 69 6e 74 20 6f 6b 3b 20 20 20 20 20 20 20 20 20  int ok;         
2bf60 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20      /* Finished 
2bf70 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 3b  ok */.  int err;
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bf90 72 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  rue if an error 
2bfa0 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e  occurs */.};.#en
2bfb0 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45  dif...#if SQLITE
2bfc0 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64 65  _OS_WIN.#include
2bfd0 20 3c 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a   <process.h>./*.
2bfe0 2a 2a 20 54 68 65 20 62 61 63 6b 67 72 6f 75 6e  ** The backgroun
2bff0 64 20 74 68 72 65 61 64 20 74 68 61 74 20 64 6f  d thread that do
2c000 65 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  es file locking.
2c010 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c020 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65  win32_file_locke
2c030 72 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  r(void *pAppData
2c040 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 33  ){.  struct win3
2c050 32 46 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d  2FileLocker *p =
2c060 20 28 73 74 72 75 63 74 20 77 69 6e 33 32 46 69   (struct win32Fi
2c070 6c 65 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44 61  leLocker*)pAppDa
2c080 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e  ta;.  if( p->evN
2c090 61 6d 65 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c  ame ){.    HANDL
2c0a0 45 20 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74  E ev = OpenEvent
2c0b0 28 45 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54  (EVENT_MODIFY_ST
2c0c0 41 54 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65  ATE, FALSE, p->e
2c0d0 76 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28  vName);.    if (
2c0e0 20 65 76 20 29 7b 0a 20 20 20 20 20 20 53 65 74   ev ){.      Set
2c0f0 45 76 65 6e 74 28 65 76 29 3b 0a 20 20 20 20 20  Event(ev);.     
2c100 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29   CloseHandle(ev)
2c110 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2c120 28 20 70 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c  ( p->delay1 ) Sl
2c130 65 65 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a  eep(p->delay1);.
2c140 20 20 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70    if( LockFile(p
2c150 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30  ->h, 0, 0, 10000
2c160 30 30 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0000, 0) ){.    
2c170 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 32 29  Sleep(p->delay2)
2c180 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  ;.    UnlockFile
2c190 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30  (p->h, 0, 0, 100
2c1a0 30 30 30 30 30 30 2c 20 30 29 3b 0a 20 20 20 20  000000, 0);.    
2c1b0 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c  p->ok = 1;.  }el
2c1c0 73 65 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d  se{.    p->err =
2c1d0 20 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48   1;.  }.  CloseH
2c1e0 61 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70  andle(p->h);.  p
2c1f0 2d 3e 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65  ->h = 0;.  p->de
2c200 6c 61 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64  lay1 = 0;.  p->d
2c210 65 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e  elay2 = 0;.}.#en
2c220 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
2c230 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20  OS_WIN./*.**    
2c240 20 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c    lock_win32_fil
2c250 65 20 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59  e FILENAME DELAY
2c260 31 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47  1 DELAY2.**.** G
2c270 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
2c280 6d 61 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f  manditory lock o
2c290 6e 20 66 69 6c 65 20 66 6f 72 20 44 45 4c 41 59  n file for DELAY
2c2a0 32 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a  2 milliseconds..
2c2b0 2a 2a 20 57 61 69 74 20 44 45 4c 41 59 31 20 6d  ** Wait DELAY1 m
2c2c0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f  illiseconds befo
2c2d0 72 65 20 61 63 71 75 69 72 69 6e 67 20 74 68 65  re acquiring the
2c2e0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
2c2f0 20 69 6e 74 20 77 69 6e 33 32 5f 66 69 6c 65 5f   int win32_file_
2c300 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63  lock(.  void * c
2c310 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2c320 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2c330 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2c340 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2c350 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63  jv[].){.  static
2c360 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c   struct win32Fil
2c370 65 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22 77  eLocker x = { "w
2c380 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c  in32_file_lock",
2c390 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
2c3a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2c3b0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68 61  zFilename;.  cha
2c3c0 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 69  r zBuf[200];.  i
2c3d0 6e 74 20 72 65 74 72 79 20 3d 20 30 3b 0a 20 20  nt retry = 0;.  
2c3e0 48 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57 4f  HANDLE ev;.  DWO
2c3f0 52 44 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a 20  RD wResult;.  . 
2c400 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20   if( objc!=4 && 
2c410 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
2c420 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2c430 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2c440 20 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59   "FILENAME DELAY
2c450 31 20 44 45 4c 41 59 32 22 29 3b 0a 20 20 20 20  1 DELAY2");.    
2c460 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2c470 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
2c480 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
2c490 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2c4a0 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
2c4b0 22 25 64 20 25 64 20 25 64 20 25 64 20 25 64 22  "%d %d %d %d %d"
2c4c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c4d0 20 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e 65         x.ok, x.e
2c4e0 72 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78 2e  rr, x.delay1, x.
2c4f0 64 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20 20  delay2, x.h);.  
2c500 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2c510 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
2c520 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2c530 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
2c540 20 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e 68 20   }.  while( x.h 
2c550 26 26 20 72 65 74 72 79 3c 33 30 20 29 7b 0a 20  && retry<30 ){. 
2c560 20 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20 20     retry++;.    
2c570 53 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 7d 0a  Sleep(100);.  }.
2c580 20 20 69 66 28 20 78 2e 68 20 29 7b 0a 20 20 20    if( x.h ){.   
2c590 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2c5a0 74 28 69 6e 74 65 72 70 2c 20 22 62 75 73 79 22  t(interp, "busy"
2c5b0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2c5c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c5d0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
2c5e0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2c5f0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
2c600 26 78 2e 64 65 6c 61 79 31 29 20 29 20 72 65 74  &x.delay1) ) ret
2c610 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2c620 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
2c630 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
2c640 62 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61 79  bjv[3], &x.delay
2c650 32 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  2) ) return TCL_
2c660 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e 61  ERROR;.  zFilena
2c670 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
2c680 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 78  ng(objv[1]);.  x
2c690 2e 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28  .h = CreateFile(
2c6a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45 52  zFilename, GENER
2c6b0 49 43 5f 52 45 41 44 7c 47 45 4e 45 52 49 43 5f  IC_READ|GENERIC_
2c6c0 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20  WRITE,.         
2c6d0 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f       FILE_SHARE_
2c6e0 52 45 41 44 7c 46 49 4c 45 5f 53 48 41 52 45 5f  READ|FILE_SHARE_
2c6f0 57 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f 41  WRITE, 0, OPEN_A
2c700 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20  LWAYS,.         
2c710 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42       FILE_ATTRIB
2c720 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a  UTE_NORMAL, 0);.
2c730 20 20 69 66 28 20 21 78 2e 68 20 29 7b 0a 20 20    if( !x.h ){.  
2c740 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2c750 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  lt(interp, "cann
2c760 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c  ot open file: ",
2c770 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61   zFilename, (cha
2c780 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2c790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2c7a0 0a 20 20 65 76 20 3d 20 43 72 65 61 74 65 45 76  .  ev = CreateEv
2c7b0 65 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c 20  ent(NULL, TRUE, 
2c7c0 46 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65 29  FALSE, x.evName)
2c7d0 3b 0a 20 20 69 66 20 28 20 21 65 76 20 29 7b 0a  ;.  if ( !ev ){.
2c7e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2c7f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
2c800 6e 6e 6f 74 20 63 72 65 61 74 65 20 65 76 65 6e  nnot create even
2c810 74 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c 20  t: ", x.evName, 
2c820 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
2c830 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c840 0a 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68 72  .  }.  _beginthr
2c850 65 61 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  ead(win32_file_l
2c860 6f 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64 2a  ocker, 0, (void*
2c870 29 26 78 29 3b 0a 20 20 53 6c 65 65 70 28 30 29  )&x);.  Sleep(0)
2c880 3b 0a 20 20 69 66 20 28 20 28 77 52 65 73 75 6c  ;.  if ( (wResul
2c890 74 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c  t = WaitForSingl
2c8a0 65 4f 62 6a 65 63 74 28 65 76 2c 20 31 30 30 30  eObject(ev, 1000
2c8b0 30 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43 54  0))!=WAIT_OBJECT
2c8c0 5f 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  _0 ){.    sqlite
2c8d0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2c8e0 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
2c8f0 30 78 25 78 22 2c 20 77 52 65 73 75 6c 74 29 3b  0x%x", wResult);
2c900 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2c910 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2c920 61 69 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a  ait failed: ", z
2c930 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
2c940 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
2c950 65 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ev);.    return 
2c960 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2c970 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29   CloseHandle(ev)
2c980 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2c990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
2c9a0 20 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61   exists_win32_pa
2c9b0 74 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65  th PATH.**.** Re
2c9c0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
2c9d0 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
2c9e0 70 61 74 68 20 65 78 69 73 74 73 2c 20 77 68 6f  path exists, who
2c9f0 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
2ca00 65 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20 65  ed name.** may e
2ca10 78 63 65 65 64 20 32 36 30 20 63 68 61 72 61 63  xceed 260 charac
2ca20 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
2ca30 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
2ca40 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
2ca50 74 20 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70  t win32_exists_p
2ca60 61 74 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  ath(.  void *cli
2ca70 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2ca80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2ca90 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2caa0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2cab0 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  [].){.  if( objc
2cac0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2cad0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2cae0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41  rp, 1, objv, "PA
2caf0 54 48 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TH");.    return
2cb00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2cb10 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2cb20 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2cb30 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20  ewBooleanObj(.  
2cb40 20 20 20 20 47 65 74 46 69 6c 65 41 74 74 72 69      GetFileAttri
2cb50 62 75 74 65 73 57 28 20 54 63 6c 5f 47 65 74 55  butesW( Tcl_GetU
2cb60 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29  nicode(objv[1]))
2cb70 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
2cb80 54 54 52 49 42 55 54 45 53 20 29 29 3b 0a 20 20  TTRIBUTES ));.  
2cb90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2cba0 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e  ../*.**      fin
2cbb0 64 5f 77 69 6e 33 32 5f 66 69 6c 65 20 50 41 54  d_win32_file PAT
2cbc0 54 45 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TERN.**.** Retur
2cbd0 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 65 6e 74  ns a list of ent
2cbe0 72 69 65 73 20 69 6e 20 61 20 64 69 72 65 63 74  ries in a direct
2cbf0 6f 72 79 20 74 68 61 74 20 6d 61 74 63 68 20 74  ory that match t
2cc00 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
2cc10 74 65 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66  tern,.** whose f
2cc20 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2cc30 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32  ame may exceed 2
2cc40 34 38 20 63 68 61 72 61 63 74 65 72 73 20 69 66  48 characters if
2cc50 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
2cc60 77 69 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a  with.** "\\?\"..
2cc70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2cc80 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65 28 0a 20  n32_find_file(. 
2cc90 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
2cca0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2ccb0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2ccc0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2ccd0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2cce0 20 20 48 41 4e 44 4c 45 20 68 46 69 6e 64 46 69    HANDLE hFindFi
2ccf0 6c 65 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  le = INVALID_HAN
2cd00 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 57 49 4e  DLE_VALUE;.  WIN
2cd10 33 32 5f 46 49 4e 44 5f 44 41 54 41 57 20 66 69  32_FIND_DATAW fi
2cd20 6e 64 44 61 74 61 3b 0a 20 20 54 63 6c 5f 4f 62  ndData;.  Tcl_Ob
2cd30 6a 20 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20 44 57  j *listObj;.  DW
2cd40 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
2cd50 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
2cd60 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2cd70 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2cd80 6f 62 6a 76 2c 20 22 50 41 54 54 45 52 4e 22 29  objv, "PATTERN")
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 68 46  _ERROR;.  }.  hF
2cdb0 69 6e 64 46 69 6c 65 20 3d 20 46 69 6e 64 46 69  indFile = FindFi
2cdc0 72 73 74 46 69 6c 65 57 28 54 63 6c 5f 47 65 74  rstFileW(Tcl_Get
2cdd0 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2cde0 2c 20 26 66 69 6e 64 44 61 74 61 29 3b 0a 20 20  , &findData);.  
2cdf0 69 66 28 20 68 46 69 6e 64 46 69 6c 65 3d 3d 49  if( hFindFile==I
2ce00 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
2ce10 4c 55 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  LUE ){.    Tcl_S
2ce20 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2ce30 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
2ce40 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72  ntObj(GetLastErr
2ce50 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75  or()));.    retu
2ce60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2ce70 7d 0a 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63  }.  listObj = Tc
2ce80 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63  l_NewObj();.  Tc
2ce90 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c  l_IncrRefCount(l
2cea0 69 73 74 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a  istObj);.  do {.
2ceb0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2cec0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2ced0 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63  erp, listObj, Tc
2cee0 6c 5f 4e 65 77 55 6e 69 63 6f 64 65 4f 62 6a 28  l_NewUnicodeObj(
2cef0 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74  .        findDat
2cf00 61 2e 63 46 69 6c 65 4e 61 6d 65 2c 20 2d 31 29  a.cFileName, -1)
2cf10 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2cf20 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2cf30 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c  interp, listObj,
2cf40 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
2cf50 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64  bj(.        find
2cf60 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
2cf70 62 75 74 65 73 29 29 3b 0a 20 20 7d 20 77 68 69  butes));.  } whi
2cf80 6c 65 28 20 46 69 6e 64 4e 65 78 74 46 69 6c 65  le( FindNextFile
2cf90 57 28 68 46 69 6e 64 46 69 6c 65 2c 20 26 66 69  W(hFindFile, &fi
2cfa0 6e 64 44 61 74 61 29 20 29 3b 0a 20 20 6c 61 73  ndData) );.  las
2cfb0 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
2cfc0 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 6c  Error();.  if( l
2cfd0 61 73 74 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52  astErrno!=NO_ERR
2cfe0 4f 52 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21  OR && lastErrno!
2cff0 3d 45 52 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46  =ERROR_NO_MORE_F
2d000 49 4c 45 53 20 29 7b 0a 20 20 20 20 46 69 6e 64  ILES ){.    Find
2d010 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29  Close(hFindFile)
2d020 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
2d030 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b  fCount(listObj);
2d040 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
2d050 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2d060 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
2d070 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
2d080 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2d090 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 46 69  _ERROR;.  }.  Fi
2d0a0 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c  ndClose(hFindFil
2d0b0 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  e);.  Tcl_SetObj
2d0c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c  Result(interp, l
2d0d0 69 73 74 4f 62 6a 29 3b 0a 20 20 72 65 74 75 72  istObj);.  retur
2d0e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2d0f0 2a 2a 20 20 20 20 20 20 64 65 6c 65 74 65 5f 77  **      delete_w
2d100 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41  in32_file FILENA
2d110 4d 45 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 73  ME.**.** Deletes
2d120 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
2d130 69 6c 65 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79  ile, whose fully
2d140 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20   qualified name 
2d150 6d 61 79 20 65 78 63 65 65 64 20 32 36 30 0a 2a  may exceed 260.*
2d160 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  * characters if 
2d170 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
2d180 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  ith "\\?\"..*/.s
2d190 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
2d1a0 64 65 6c 65 74 65 5f 66 69 6c 65 28 0a 20 20 76  delete_file(.  v
2d1b0 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
2d1c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2d1d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2d1e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2d1f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2d200 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
2d210 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2d220 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2d230 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 22 29  bjv, "FILENAME")
2d240 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2d250 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2d260 28 20 21 44 65 6c 65 74 65 46 69 6c 65 57 28 54  ( !DeleteFileW(T
2d270 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62  cl_GetUnicode(ob
2d280 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54  jv[1])) ){.    T
2d290 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2d2a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
2d2b0 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73  ideIntObj(GetLas
2d2c0 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20  tError()));.    
2d2d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2d2e0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65  ;.  }.  Tcl_Rese
2d2f0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
2d300 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2d310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
2d320 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 20 44  make_win32_dir D
2d330 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43  IRECTORY.**.** C
2d340 72 65 61 74 65 73 20 74 68 65 20 73 70 65 63 69  reates the speci
2d350 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20  fied directory, 
2d360 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c  whose fully qual
2d370 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65  ified name may e
2d380 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61  xceed 248.** cha
2d390 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
2d3a0 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22   prefixed with "
2d3b0 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  \\?\"..*/.static
2d3c0 20 69 6e 74 20 77 69 6e 33 32 5f 6d 6b 64 69 72   int win32_mkdir
2d3d0 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
2d3e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2d3f0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2d400 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2d410 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2d420 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ){.  if( objc!=2
2d430 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2d440 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2d450 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43   1, objv, "DIREC
2d460 54 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75  TORY");.    retu
2d470 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d480 7d 0a 20 20 69 66 28 20 21 43 72 65 61 74 65 44  }.  if( !CreateD
2d490 69 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65  irectoryW(Tcl_Ge
2d4a0 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d  tUnicode(objv[1]
2d4b0 29 2c 20 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  ), NULL) ){.    
2d4c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2d4d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2d4e0 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61  WideIntObj(GetLa
2d4f0 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20  stError()));.   
2d500 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2d510 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73  R;.  }.  Tcl_Res
2d520 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
2d530 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2d540 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
2d550 20 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69   remove_win32_di
2d560 72 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a  r DIRECTORY.**.*
2d570 2a 20 52 65 6d 6f 76 65 73 20 74 68 65 20 73 70  * Removes the sp
2d580 65 63 69 66 69 65 64 20 64 69 72 65 63 74 6f 72  ecified director
2d590 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  y, whose fully q
2d5a0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
2d5b0 79 20 65 78 63 65 65 64 20 32 34 38 0a 2a 2a 20  y exceed 248.** 
2d5c0 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74  characters if it
2d5d0 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74   is prefixed wit
2d5e0 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  h "\\?\"..*/.sta
2d5f0 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 72 6d  tic int win32_rm
2d600 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  dir(.  void *cli
2d610 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2d620 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2d630 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2d640 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2d650 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  [].){.  if( objc
2d660 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2d670 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2d680 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49  rp, 1, objv, "DI
2d690 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20 72  RECTORY");.    r
2d6a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d6b0 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 6d 6f  .  }.  if( !Remo
2d6c0 76 65 44 69 72 65 63 74 6f 72 79 57 28 54 63 6c  veDirectoryW(Tcl
2d6d0 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
2d6e0 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c  [1])) ){.    Tcl
2d6f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2d700 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
2d710 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
2d720 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
2d730 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2d740 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52    }.  Tcl_ResetR
2d750 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2d760 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2d770 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
2d780 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69        optimizati
2d790 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42 20 4f 50  on_control DB OP
2d7a0 54 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20  T BOOLEAN.**.** 
2d7b0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
2d7c0 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 61  e query optimiza
2d7d0 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20  tions using the 
2d7e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2d7f0 74 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65 72 66  trol().** interf
2d800 61 63 65 2e 20 20 44 69 73 61 62 6c 65 20 69 66  ace.  Disable if
2d810 20 42 4f 4f 4c 45 41 4e 20 69 73 20 66 61 6c 73   BOOLEAN is fals
2d820 65 20 61 6e 64 20 65 6e 61 62 6c 65 20 69 66 20  e and enable if 
2d830 42 4f 4f 4c 45 41 4e 20 69 73 20 74 72 75 65 2e  BOOLEAN is true.
2d840 0a 2a 2a 20 4f 50 54 20 69 73 20 74 68 65 20 6e  .** OPT is the n
2d850 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6d  ame of the optim
2d860 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20 64 69  ization to be di
2d870 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  sabled..*/.stati
2d880 63 20 69 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  c int optimizati
2d890 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f  on_control(.  vo
2d8a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2d8b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2d8c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2d8d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2d8e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2d8f0 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
2d900 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
2d910 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20  ar *zOpt;.  int 
2d920 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73  onoff;.  int mas
2d930 6b 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  k = 0;.  static 
2d940 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
2d950 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2d960 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74  OptName;.    int
2d970 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b   mask;.  } aOpt[
2d980 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c  ] = {.    { "all
2d990 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2d9a0 20 20 20 53 51 4c 49 54 45 5f 41 6c 6c 4f 70 74     SQLITE_AllOpt
2d9b0 73 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  s        },.    
2d9c0 7b 20 22 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20  { "none",       
2d9d0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2d9f0 2c 0a 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66  ,.    { "query-f
2da00 6c 61 74 74 65 6e 65 72 22 2c 20 20 20 20 20 53  lattener",     S
2da10 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
2da20 65 6e 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 63  ener },.    { "c
2da30 6f 6c 75 6d 6e 2d 63 61 63 68 65 22 2c 20 20 20  olumn-cache",   
2da40 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 6c 75       SQLITE_Colu
2da50 6d 6e 43 61 63 68 65 20 20 20 20 7d 2c 0a 20 20  mnCache    },.  
2da60 20 20 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72 64    { "groupby-ord
2da70 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  er",       SQLIT
2da80 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 20  E_GroupByOrder  
2da90 20 7d 2c 0a 20 20 20 20 7b 20 22 66 61 63 74 6f   },.    { "facto
2daa0 72 2d 63 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20  r-constants",   
2dab0 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75   SQLITE_FactorOu
2dac0 74 43 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20  tConst },.    { 
2dad0 22 64 69 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20  "distinct-opt", 
2dae0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 69         SQLITE_Di
2daf0 73 74 69 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a  stinctOpt    },.
2db00 20 20 20 20 7b 20 22 63 6f 76 65 72 2d 69 64 78      { "cover-idx
2db10 2d 73 63 61 6e 22 2c 20 20 20 20 20 20 53 51 4c  -scan",      SQL
2db20 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
2db30 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64     },.    { "ord
2db40 65 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c  er-by-idx-join",
2db50 20 20 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42     SQLITE_OrderB
2db60 79 49 64 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20  yIdxJoin },.    
2db70 7b 20 22 74 72 61 6e 73 69 74 69 76 65 22 2c 20  { "transitive", 
2db80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2db90 54 72 61 6e 73 69 74 69 76 65 20 20 20 20 20 7d  Transitive     }
2dba0 2c 0a 20 20 20 20 7b 20 22 73 75 62 71 75 65 72  ,.    { "subquer
2dbb0 79 2d 63 6f 72 6f 75 74 69 6e 65 22 2c 20 20 53  y-coroutine",  S
2dbc0 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
2dbd0 69 6e 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  ine  },.    { "o
2dbe0 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20  mit-noop-join", 
2dbf0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 6d 69 74       SQLITE_Omit
2dc00 4e 6f 6f 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20  NoopJoin   },.  
2dc10 20 20 7b 20 22 73 74 61 74 33 22 2c 20 20 20 20    { "stat3",    
2dc20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2dc30 45 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20  E_Stat34        
2dc40 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 34   },.    { "stat4
2dc50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2dc60 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20   SQLITE_Stat34  
2dc70 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a         },.  };..
2dc80 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
2dc90 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2dca0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2dcb0 20 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42   objv, "DB OPT B
2dcc0 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65  OOLEAN");.    re
2dcd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2dce0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2dcf0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2dd00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2dd10 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
2dd20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2dd30 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
2dd40 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
2dd50 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e  rp, objv[3], &on
2dd60 6f 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43  off) ) return TC
2dd70 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20  L_ERROR;.  zOpt 
2dd80 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2dd90 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28  objv[2]);.  for(
2dda0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
2ddb0 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b  pt)/sizeof(aOpt[
2ddc0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
2ddd0 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20  f( strcmp(zOpt, 
2dde0 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65  aOpt[i].zOptName
2ddf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61  )==0 ){.      ma
2de00 73 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73  sk = aOpt[i].mas
2de10 6b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  k;.      break;.
2de20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2de30 6f 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e  onoff ) mask = ~
2de40 6d 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73  mask;.  if( i>=s
2de50 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65  izeof(aOpt)/size
2de60 6f 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20  of(aOpt[0]) ){. 
2de70 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2de80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
2de90 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  nown optimizatio
2dea0 6e 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  n - should be on
2deb0 65 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20  e of:",.        
2dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2ded0 61 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28  ar*)0);.    for(
2dee0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
2def0 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b  pt)/sizeof(aOpt[
2df00 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
2df10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2df20 74 28 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61  t(interp, " ", a
2df30 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c  Opt[i].zOptName,
2df40 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2df50 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
2df60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
2df70 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2df80 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2df90 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
2dfa0 2c 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72  , db, mask);.  r
2dfb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2dfc0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2dfd0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2dfe0 69 6e 65 73 20 73 71 6c 69 74 65 33 5f 61 70 69  ines sqlite3_api
2dff0 5f 72 6f 75 74 69 6e 65 73 3b 0a 2f 2a 0a 2a 2a  _routines;./*.**
2e000 20 20 20 20 20 6c 6f 61 64 5f 73 74 61 74 69 63       load_static
2e010 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 20 4e 41  _extension DB NA
2e020 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61  ME ....**.** Loa
2e030 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 74  d one or more st
2e040 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20  atically linked 
2e050 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73  extensions..*/.s
2e060 74 61 74 69 63 20 69 6e 74 20 74 63 6c 4c 6f 61  tatic int tclLoa
2e070 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f 6e  dStaticExtension
2e080 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  Cmd(.  void * cl
2e090 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2e0a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2e0b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2e0c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2e0d0 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20  v[].){.  extern 
2e0e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 6d 61 74  int sqlite3_amat
2e0f0 63 68 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ch_init(sqlite3*
2e100 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2e110 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2e120 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2e130 6e 74 20 73 71 6c 69 74 65 33 5f 63 61 72 72 61  nt sqlite3_carra
2e140 79 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  y_init(sqlite3*,
2e150 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2e160 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2e170 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2e180 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72  t sqlite3_closur
2e190 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  e_init(sqlite3*,
2e1a0 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2e1b0 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2e1c0 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2e1d0 74 20 73 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e  t sqlite3_csv_in
2e1e0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2e1f0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2e200 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2e210 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2e220 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74 28  lite3_eval_init(
2e230 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2e240 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2e250 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2e260 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2e270 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 73  e3_fileio_init(s
2e280 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2e290 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2e2a0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2e2b0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2e2c0 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71  3_fuzzer_init(sq
2e2d0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2e2e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2e2f0 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
2e300 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2e310 5f 69 65 65 65 5f 69 6e 69 74 28 73 71 6c 69 74  _ieee_init(sqlit
2e320 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2e330 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2e340 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2e350 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65  n int sqlite3_ne
2e360 78 74 63 68 61 72 5f 69 6e 69 74 28 73 71 6c 69  xtchar_init(sqli
2e370 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2e380 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2e390 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2e3a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
2e3b0 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28 73  ercentile_init(s
2e3c0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2e3d0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2e3e0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2e3f0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2e400 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 28 73 71  3_regexp_init(sq
2e410 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2e420 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2e430 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
2e440 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2e450 5f 73 65 72 69 65 73 5f 69 6e 69 74 28 73 71 6c  _series_init(sql
2e460 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2e470 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2e480 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2e490 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2e4a0 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71  spellfix_init(sq
2e4b0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2e4c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2e4d0 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
2e4e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2e4f0 5f 74 6f 74 79 70 65 5f 69 6e 69 74 28 73 71 6c  _totype_init(sql
2e500 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2e510 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2e520 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2e530 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2e540 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74  wholenumber_init
2e550 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2e560 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2e570 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2e580 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2e590 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
2e5a0 20 63 68 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b   char *zExtName;
2e5b0 0a 20 20 20 20 69 6e 74 20 28 2a 70 49 6e 69 74  .    int (*pInit
2e5c0 29 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  )(sqlite3*,char*
2e5d0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2e5e0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2e5f0 20 20 7d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d    } aExtension[]
2e600 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74   = {.    { "amat
2e610 63 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ch",            
2e620 20 20 20 20 73 71 6c 69 74 65 33 5f 61 6d 61 74      sqlite3_amat
2e630 63 68 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ch_init         
2e640 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2e650 63 61 72 72 61 79 22 2c 20 20 20 20 20 20 20 20  carray",        
2e660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e670 63 61 72 72 61 79 5f 69 6e 69 74 20 20 20 20 20  carray_init     
2e680 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2e690 20 7b 20 22 63 6c 6f 73 75 72 65 22 2c 20 20 20   { "closure",   
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e6b0 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74  te3_closure_init
2e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2e6d0 0a 20 20 20 20 7b 20 22 63 73 76 22 2c 20 20 20  .    { "csv",   
2e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6f0 73 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74  sqlite3_csv_init
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e710 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 76 61 6c    },.    { "eval
2e720 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2e730 20 20 20 20 73 71 6c 69 74 65 33 5f 65 76 61 6c      sqlite3_eval
2e740 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2e750 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2e760 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20 20 20  fileio",        
2e770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e780 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20 20 20  fileio_init     
2e790 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2e7a0 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20 20 20   { "fuzzer",    
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e7c0 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 20  te3_fuzzer_init 
2e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2e7e0 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35 34 22  .    { "ieee754"
2e7f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e800 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e 69  sqlite3_ieee_ini
2e810 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e820 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65 78 74    },.    { "next
2e830 63 68 61 72 22 2c 20 20 20 20 20 20 20 20 20 20  char",          
2e840 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74      sqlite3_next
2e850 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20 20 20  char_init       
2e860 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2e870 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20 20 20  percentile",    
2e880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e890 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 20  percentile_init 
2e8a0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2e8b0 20 7b 20 22 72 65 67 65 78 70 22 2c 20 20 20 20   { "regexp",    
2e8c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e8d0 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 20  te3_regexp_init 
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2e8f0 0a 20 20 20 20 7b 20 22 73 65 72 69 65 73 22 2c  .    { "series",
2e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e910 73 71 6c 69 74 65 33 5f 73 65 72 69 65 73 5f 69  sqlite3_series_i
2e920 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2e930 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c    },.    { "spel
2e940 6c 66 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  lfix",          
2e950 20 20 20 20 73 71 6c 69 74 65 33 5f 73 70 65 6c      sqlite3_spel
2e960 6c 66 69 78 5f 69 6e 69 74 20 20 20 20 20 20 20  lfix_init       
2e970 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2e980 74 6f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20  totype",        
2e990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e9a0 74 6f 74 79 70 65 5f 69 6e 69 74 20 20 20 20 20  totype_init     
2e9b0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2e9c0 20 7b 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22   { "wholenumber"
2e9d0 2c 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,           sqli
2e9e0 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f  te3_wholenumber_
2e9f0 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 7d 2c  init          },
2ea00 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20  .  };.  sqlite3 
2ea10 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
2ea20 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  r *zName;.  int 
2ea30 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72  i, j, rc;.  char
2ea40 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
2ea50 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20   if( objc<3 ){. 
2ea60 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2ea70 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2ea80 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e  bjv, "DB NAME ..
2ea90 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
2eaa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2eab0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2eac0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2ead0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2eae0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
2eaf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  TCL_ERROR;.  for
2eb00 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b  (j=2; j<objc; j+
2eb10 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  +){.    zName = 
2eb20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2eb30 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  jv[j]);.    for(
2eb40 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
2eb50 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b  (aExtension); i+
2eb60 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
2eb70 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74  rcmp(zName, aExt
2eb80 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61  ension[i].zExtNa
2eb90 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
2eba0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2ebb0 3d 41 72 72 61 79 53 69 7a 65 28 61 45 78 74 65  =ArraySize(aExte
2ebc0 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  nsion) ){.      
2ebd0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2ebe0 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63  (interp, "no suc
2ebf0 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20  h extension: ", 
2ec00 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  zName, (char*)0)
2ec10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
2ec20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2ec30 20 20 20 20 69 66 28 20 61 45 78 74 65 6e 73 69      if( aExtensi
2ec40 6f 6e 5b 69 5d 2e 70 49 6e 69 74 20 29 7b 0a 20  on[i].pInit ){. 
2ec50 20 20 20 20 20 72 63 20 3d 20 61 45 78 74 65 6e       rc = aExten
2ec60 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62  sion[i].pInit(db
2ec70 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a  , &zErrMsg, 0);.
2ec80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ec90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2eca0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2ecb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2ecc0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
2ecd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2ece0 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 69 74 69  t(interp, "initi
2ecf0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 22 2c 20  alization of ", 
2ed00 7a 4e 61 6d 65 2c 20 22 20 66 61 69 6c 65 64 3a  zName, " failed:
2ed10 20 22 2c 20 7a 45 72 72 4d 73 67 2c 0a 20 20 20   ", zErrMsg,.   
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed30 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
2ed40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ed50 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
2ed60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2ed70 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
2ed80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2ed90 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74  ../*.**     sort
2eda0 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70  er_test_fakeheap
2edb0 20 42 4f 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74   BOOL.**.*/.stat
2edc0 69 63 20 69 6e 74 20 73 6f 72 74 65 72 5f 74 65  ic int sorter_te
2edd0 73 74 5f 66 61 6b 65 68 65 61 70 28 0a 20 20 76  st_fakeheap(.  v
2ede0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
2edf0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2ee00 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2ee10 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2ee20 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2ee30 20 69 6e 74 20 62 41 72 67 3b 0a 20 20 69 66 28   int bArg;.  if(
2ee40 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2ee50 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2ee60 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2ee70 2c 20 22 42 4f 4f 4c 22 29 3b 0a 20 20 20 20 72  , "BOOL");.    r
2ee80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ee90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 54 63 6c 5f  .  }..  if( Tcl_
2eea0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
2eeb0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
2eec0 5d 2c 20 26 62 41 72 67 29 20 29 7b 0a 20 20 20  ], &bArg) ){.   
2eed0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2eee0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 41  R;.  }..  if( bA
2eef0 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  rg ){.    if( sq
2ef00 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2ef10 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
2ef20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2ef30 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
2ef40 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2ef50 52 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  R(-1);.    }.  }
2ef60 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 73 71  else{.    if( sq
2ef70 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2ef80 67 2e 70 48 65 61 70 3d 3d 53 51 4c 49 54 45 5f  g.pHeap==SQLITE_
2ef90 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29 20 29  INT_TO_PTR(-1) )
2efa0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
2efb0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
2efc0 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  p = 0;.    }.  }
2efd0 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ..  Tcl_ResetRes
2efe0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
2eff0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2f000 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65  ./*.**     sorte
2f010 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c  r_test_sort4_hel
2f020 70 65 72 20 44 42 20 53 51 4c 31 20 4e 53 54 45  per DB SQL1 NSTE
2f030 50 20 53 51 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d  P SQL2.**.** Com
2f040 70 69 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  pile SQL stateme
2f050 6e 74 20 24 53 51 4c 31 20 61 6e 64 20 73 74 65  nt $SQL1 and ste
2f060 70 20 69 74 20 24 4e 53 54 45 50 20 74 69 6d 65  p it $NSTEP time
2f070 73 2e 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  s. For each row,
2f080 20 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20   .** check that 
2f090 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64  the leftmost and
2f0a0 20 72 69 67 68 74 6d 6f 73 74 20 63 6f 6c 75 6d   rightmost colum
2f0b0 6e 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20  ns returned are 
2f0c0 62 6f 74 68 20 69 6e 74 65 67 65 72 73 2c 0a 2a  both integers,.*
2f0d0 2a 20 61 6e 64 20 74 68 61 74 20 62 6f 74 68 20  * and that both 
2f0e0 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
2f0f0 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
2f100 65 6e 20 65 78 65 63 75 74 65 20 73 74 61 74 65  en execute state
2f110 6d 65 6e 74 20 24 53 51 4c 32 2e 20 43 68 65 63  ment $SQL2. Chec
2f120 6b 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  k that the state
2f130 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65  ment returns the
2f140 20 73 61 6d 65 0a 2a 2a 20 73 65 74 20 6f 66 20   same.** set of 
2f150 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20  integers in the 
2f160 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 69 6e  same order as in
2f170 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74   the previous st
2f180 65 70 20 28 75 73 69 6e 67 20 24 53 51 4c 31 29  ep (using $SQL1)
2f190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f1a0 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74  sorter_test_sort
2f1b0 34 5f 68 65 6c 70 65 72 28 0a 20 20 76 6f 69 64  4_helper(.  void
2f1c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2f1d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2f1e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2f1f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2f200 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
2f210 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 3b  nst char *zSql1;
2f220 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f230 53 71 6c 32 3b 0a 20 20 69 6e 74 20 6e 53 74 65  Sql2;.  int nSte
2f240 70 3b 20 0a 20 20 69 6e 74 20 69 53 74 65 70 3b  p; .  int iStep;
2f250 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74   .  unsigned int
2f260 20 69 43 6b 73 75 6d 31 20 3d 20 30 3b 20 0a 20   iCksum1 = 0; . 
2f270 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43   unsigned int iC
2f280 6b 73 75 6d 32 20 3d 20 30 3b 20 0a 20 20 69 6e  ksum2 = 0; .  in
2f290 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 42 3b 0a  t rc;.  int iB;.
2f2a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2f2b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2f2c0 53 74 6d 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f  Stmt;.  .  if( o
2f2d0 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
2f2e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2f2f0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2f300 22 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53  "DB SQL1 NSTEP S
2f310 51 4c 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72  QL2");.    retur
2f320 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2f330 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
2f340 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2f350 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2f360 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
2f370 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2f380 7a 53 71 6c 31 20 3d 20 54 63 6c 5f 47 65 74 53  zSql1 = Tcl_GetS
2f390 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
2f3a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2f3b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2f3c0 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 74 65 70 29  objv[3], &nStep)
2f3d0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2f3e0 52 4f 52 3b 0a 20 20 7a 53 71 6c 32 20 3d 20 54  ROR;.  zSql2 = T
2f3f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2f400 76 5b 34 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  v[4]);..  rc = s
2f410 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2f420 32 28 64 62 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c  2(db, zSql1, -1,
2f430 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
2f440 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f450 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f   ) goto sql_erro
2f460 72 3b 0a 0a 20 20 69 42 20 3d 20 73 71 6c 69 74  r;..  iB = sqlit
2f470 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
2f480 70 53 74 6d 74 29 2d 31 3b 0a 20 20 66 6f 72 28  pStmt)-1;.  for(
2f490 69 53 74 65 70 3d 30 3b 20 69 53 74 65 70 3c 6e  iStep=0; iStep<n
2f4a0 53 74 65 70 20 26 26 20 53 51 4c 49 54 45 5f 52  Step && SQLITE_R
2f4b0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2f4c0 28 70 53 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b  (pStmt); iStep++
2f4d0 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 73  ){.    int a = s
2f4e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2f4f0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
2f500 20 69 66 28 20 61 21 3d 73 71 6c 69 74 65 33 5f   if( a!=sqlite3_
2f510 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2f520 2c 20 69 42 29 20 29 7b 0a 20 20 20 20 20 20 54  , iB) ){.      T
2f530 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2f540 69 6e 74 65 72 70 2c 20 22 64 61 74 61 20 65 72  interp, "data er
2f550 72 6f 72 3a 20 28 61 21 3d 62 29 22 2c 20 30 29  ror: (a!=b)", 0)
2f560 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
2f570 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2f580 0a 20 20 20 20 69 43 6b 73 75 6d 31 20 2b 3d 20  .    iCksum1 += 
2f590 28 69 43 6b 73 75 6d 31 20 3c 3c 20 33 29 20 2b  (iCksum1 << 3) +
2f5a0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 61   (unsigned int)a
2f5b0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2f5c0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2f5d0 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  tmt);.  if( rc!=
2f5e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2f5f0 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 72   sql_error;..  r
2f600 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2f610 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 32  are_v2(db, zSql2
2f620 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2f630 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2f640 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c  TE_OK ) goto sql
2f650 5f 65 72 72 6f 72 3b 0a 20 20 66 6f 72 28 69 53  _error;.  for(iS
2f660 74 65 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f  tep=0; SQLITE_RO
2f670 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
2f680 70 53 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29  pStmt); iStep++)
2f690 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 73 71  {.    int a = sq
2f6a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2f6b0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
2f6c0 69 43 6b 73 75 6d 32 20 2b 3d 20 28 69 43 6b 73  iCksum2 += (iCks
2f6d0 75 6d 32 20 3c 3c 20 33 29 20 2b 20 28 75 6e 73  um2 << 3) + (uns
2f6e0 69 67 6e 65 64 20 69 6e 74 29 61 3b 0a 20 20 7d  igned int)a;.  }
2f6f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2f700 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2f710 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2f720 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f  E_OK ) goto sql_
2f730 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43  error;..  if( iC
2f740 6b 73 75 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29  ksum1!=iCksum2 )
2f750 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2f760 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2f770 63 68 65 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63  checksum mismatc
2f780 68 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  h", 0);.    retu
2f790 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2f7a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
2f7b0 4f 4b 3b 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a  OK;. sql_error:.
2f7c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2f7d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 20  lt(interp, "sql 
2f7e0 65 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  error: ", sqlite
2f7f0 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
2f800 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
2f810 52 52 4f 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  RROR;.}...#ifdef
2f820 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
2f830 48 45 4e 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63  HENTICATION.#inc
2f840 6c 75 64 65 20 22 73 71 6c 69 74 65 33 75 73 65  lude "sqlite3use
2f850 72 61 75 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74  rauth.h"./*.** t
2f860 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
2f870 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74  user_authenticat
2f880 65 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41  e DB USERNAME PA
2f890 53 53 57 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63  SSWORD.*/.static
2f8a0 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61   int test_user_a
2f8b0 75 74 68 65 6e 74 69 63 61 74 65 28 0a 20 20 43  uthenticate(.  C
2f8c0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2f8d0 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
2f8e0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2f8f0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2f900 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2f910 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2f920 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2f930 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2f940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f950 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2f960 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2f970 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2f980 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2f990 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
2f9a0 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  User = 0;.  char
2f9b0 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20   *zPasswd = 0;. 
2f9c0 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30   int nPasswd = 0
2f9d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2f9e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2f9f0 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
2fa00 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2fa10 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2fa20 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20  v, "DB USERNAME 
2fa30 50 41 53 53 57 4f 52 44 22 29 3b 0a 20 20 20 20  PASSWORD");.    
2fa40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2fa50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2fa60 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2fa70 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2fa80 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
2fa90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2faa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73  ERROR;.  }.  zUs
2fab0 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  er = Tcl_GetStri
2fac0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
2fad0 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74  Passwd = Tcl_Get
2fae0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
2faf0 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29  jv[3], &nPasswd)
2fb00 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2fb10 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61  _user_authentica
2fb20 74 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50  te(db, zUser, zP
2fb30 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 29 3b  asswd, nPasswd);
2fb40 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
2fb50 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2fb60 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
2fb70 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
2fb80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2fb90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2fba0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
2fbb0 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65  CATION */..#ifde
2fbc0 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
2fbd0 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a  THENTICATION./*.
2fbe0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
2fbf0 74 65 33 5f 75 73 65 72 5f 61 64 64 20 44 42 20  te3_user_add DB 
2fc00 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
2fc10 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61  D ISADMIN.*/.sta
2fc20 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73 65  tic int test_use
2fc30 72 5f 61 64 64 28 0a 20 20 43 6c 69 65 6e 74 44  r_add(.  ClientD
2fc40 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2fc50 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
2fc60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2fc70 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2fc80 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2fc90 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2fca0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2fcb0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2fcc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2fcd0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2fce0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2fcf0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2fd00 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2fd10 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  .  char *zUser =
2fd20 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73   0;.  char *zPas
2fd30 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  swd = 0;.  int n
2fd40 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
2fd50 74 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20  t isAdmin = 0;. 
2fd60 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2fd70 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2fd80 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
2fd90 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2fda0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2fdb0 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53  "DB USERNAME PAS
2fdc0 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b  SWORD ISADMIN");
2fdd0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2fde0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2fdf0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2fe00 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2fe10 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2fe20 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
2fe30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2fe40 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65    zUser = Tcl_Ge
2fe50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2fe60 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63  ;.  zPasswd = Tc
2fe70 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
2fe80 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61  bj(objv[3], &nPa
2fe90 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74  sswd);.  Tcl_Get
2fea0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
2feb0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
2fec0 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20  &isAdmin);.  rc 
2fed0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61  = sqlite3_user_a
2fee0 64 64 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50  dd(db, zUser, zP
2fef0 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20  asswd, nPasswd, 
2ff00 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f  isAdmin);.  Tcl_
2ff10 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2ff20 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
2ff30 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
2ff40 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
2ff50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
2ff60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
2ff70 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
2ff80 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
2ff90 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2ffa0 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ATION./*.** tclc
2ffb0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
2ffc0 72 5f 63 68 61 6e 67 65 20 44 42 20 55 53 45 52  r_change DB USER
2ffd0 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53  NAME PASSWORD IS
2ffe0 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20  ADMIN.*/.static 
2fff0 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 63 68  int test_user_ch
30000 61 6e 67 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  ange(.  ClientDa
30010 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
30020 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
30030 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
30040 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
30050 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
30060 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
30070 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
30080 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
30090 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
300a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
300b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
300c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
300d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
300e0 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20    char *zUser = 
300f0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73  0;.  char *zPass
30100 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  wd = 0;.  int nP
30110 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74  asswd = 0;.  int
30120 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20   isAdmin = 0;.  
30130 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
30140 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
30150 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
30160 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
30170 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
30180 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
30190 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a  WORD ISADMIN");.
301a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
301b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
301c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
301d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
301e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
301f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
30200 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
30210 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74   zUser = Tcl_Get
30220 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
30230 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c  .  zPasswd = Tcl
30240 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
30250 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73  j(objv[3], &nPas
30260 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42  swd);.  Tcl_GetB
30270 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
30280 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
30290 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d  isAdmin);.  rc =
302a0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68   sqlite3_user_ch
302b0 61 6e 67 65 28 64 62 2c 20 7a 55 73 65 72 2c 20  ange(db, zUser, 
302c0 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64  zPasswd, nPasswd
302d0 2c 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63  , isAdmin);.  Tc
302e0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
302f0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
30300 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
30310 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
30320 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
30330 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53  dif /* SQLITE_US
30340 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
30350 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
30360 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
30370 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63  ICATION./*.** tc
30380 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75  lcmd:  sqlite3_u
30390 73 65 72 5f 64 65 6c 65 74 65 20 44 42 20 55 53  ser_delete DB US
303a0 45 52 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63  ERNAME.*/.static
303b0 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 64   int test_user_d
303c0 65 6c 65 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  elete(.  ClientD
303d0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
303e0 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
303f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
30400 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
30410 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
30420 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
30430 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
30440 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
30450 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30460 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
30470 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
30480 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
30490 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
304a0 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  .  char *zUser =
304b0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
304c0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
304d0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
304e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
304f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
30500 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d  bjv, "DB USERNAM
30510 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
30520 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
30530 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
30540 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
30550 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
30560 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
30570 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30580 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63    }.  zUser = Tc
30590 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
305a0 5b 32 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  [2]);.  rc = sql
305b0 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65  ite3_user_delete
305c0 28 64 62 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54  (db, zUser);.  T
305d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
305e0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
305f0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
30600 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
30610 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
30620 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55  ndif /* SQLITE_U
30630 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
30640 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ON */../*.** tcl
30650 63 6d 64 3a 20 62 61 64 5f 62 65 68 61 76 69 6f  cmd: bad_behavio
30660 72 20 54 59 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20  r TYPE.**.** Do 
30670 73 6f 6d 65 20 74 68 69 6e 67 73 20 74 68 61 74  some things that
30680 20 73 68 6f 75 6c 64 20 74 72 69 67 67 65 72 20   should trigger 
30690 61 20 76 61 6c 67 72 69 6e 64 20 6f 72 20 2d 66  a valgrind or -f
306a0 73 61 6e 69 74 69 7a 65 3d 75 6e 64 65 66 69 6e  sanitize=undefin
306b0 65 64 0a 2a 2a 20 77 61 72 6e 69 6e 67 2e 20 20  ed.** warning.  
306c0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
306d0 76 65 72 69 66 79 20 74 68 61 74 20 65 72 72 6f  verify that erro
306e0 72 73 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  rs and warnings 
306f0 6f 75 74 70 75 74 20 62 79 20 74 68 6f 73 65 0a  output by those.
30700 2a 2a 20 74 6f 6f 6c 73 20 61 72 65 20 64 65 74  ** tools are det
30710 65 63 74 65 64 20 62 79 20 74 68 65 20 74 65 73  ected by the tes
30720 74 20 73 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a  t scripts..**.**
30730 20 20 20 20 20 20 20 54 59 50 45 20 20 20 20 20         TYPE     
30740 20 20 42 45 48 41 56 49 4f 52 0a 2a 2a 20 20 20    BEHAVIOR.**   
30750 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 4f      1          O
30760 76 65 72 66 6c 6f 77 20 61 20 73 69 67 6e 65 64  verflow a signed
30770 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
30780 20 20 32 20 20 20 20 20 20 20 20 20 20 4a 75 6d    2          Jum
30790 70 20 62 61 73 65 64 20 6f 6e 20 61 6e 20 75 6e  p based on an un
307a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 72 69  initialized vari
307b0 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 33 20  able.**       3 
307c0 20 20 20 20 20 20 20 20 20 52 65 61 64 20 61 66           Read af
307d0 74 65 72 20 66 72 65 65 0a 2a 2a 20 20 20 20 20  ter free.**     
307e0 20 20 34 20 20 20 20 20 20 20 20 20 20 50 61 6e    4          Pan
307f0 69 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ic.*/.static int
30800 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69   test_bad_behavi
30810 6f 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  or(.  ClientData
30820 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
30830 50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  Pointer to an in
30840 74 65 67 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  teger containing
30850 20 7a 65 72 6f 20 2a 2f 0a 20 20 54 63 6c 5f 49   zero */.  Tcl_I
30860 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
30870 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
30880 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
30890 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
308a0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
308b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
308c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
308d0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
308e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
308f0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
30900 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
30910 6e 74 20 69 54 79 70 65 3b 0a 20 20 69 6e 74 20  nt iType;.  int 
30920 78 79 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20 2a  xyz;.  int i = *
30930 28 69 6e 74 2a 29 63 6c 69 65 6e 74 44 61 74 61  (int*)clientData
30940 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  ;.  int j;.  int
30950 20 77 5b 31 30 5d 3b 0a 20 20 69 6e 74 20 2a 61   w[10];.  int *a
30960 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
30970 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
30980 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
30990 31 2c 20 6f 62 6a 76 2c 20 22 54 59 50 45 22 29  1, objv, "TYPE")
309a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
309b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
309c0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
309d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
309e0 5b 31 5d 2c 20 26 69 54 79 70 65 29 20 29 20 72  [1], &iType) ) r
309f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
30a00 0a 20 20 73 77 69 74 63 68 28 20 69 54 79 70 65  .  switch( iType
30a10 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
30a20 7b 0a 20 20 20 20 20 20 78 79 7a 20 3d 20 30 78  {.      xyz = 0x
30a30 37 66 66 66 66 66 30 30 20 2d 20 69 3b 0a 20 20  7fffff00 - i;.  
30a40 20 20 20 20 78 79 7a 20 2b 3d 20 30 78 31 30 30      xyz += 0x100
30a50 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  ;.      Tcl_SetO
30a60 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
30a70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78   Tcl_NewIntObj(x
30a80 79 7a 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  yz));.      brea
30a90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
30aa0 65 20 32 3a 20 7b 0a 20 20 20 20 20 20 77 5b 31  e 2: {.      w[1
30ab0 5d 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28  ] = 5;.      if(
30ac0 20 77 5b 69 5d 3e 30 20 29 20 77 5b 31 5d 2b 2b   w[i]>0 ) w[1]++
30ad0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  ;.      Tcl_SetO
30ae0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
30af0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 77   Tcl_NewIntObj(w
30b00 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65  [1]));.      bre
30b10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
30b20 73 65 20 33 3a 20 7b 0a 20 20 20 20 20 20 61 20  se 3: {.      a 
30b30 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  = malloc( sizeof
30b40 28 69 6e 74 29 2a 31 30 20 29 3b 0a 20 20 20 20  (int)*10 );.    
30b50 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 30 3b    for(j=0; j<10;
30b60 20 6a 2b 2b 29 20 61 5b 6a 5d 20 3d 20 6a 3b 0a   j++) a[j] = j;.
30b70 20 20 20 20 20 20 66 72 65 65 28 61 29 3b 0a 20        free(a);. 
30b80 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
30b90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
30ba0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 5b 69 5d  l_NewIntObj(a[i]
30bb0 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
30bc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
30bd0 34 3a 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 50  4: {.      Tcl_P
30be0 61 6e 69 63 28 22 44 65 6c 69 62 65 72 61 74 65  anic("Deliberate
30bf0 20 70 61 6e 69 63 22 29 3b 0a 20 20 20 20 20 20   panic");.      
30c00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
30c10 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
30c20 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;.}  ../*.** tcl
30c30 63 6d 64 3a 20 20 20 72 65 67 69 73 74 65 72 5f  cmd:   register_
30c40 64 62 73 74 61 74 5f 76 74 61 62 20 44 42 0a 2a  dbstat_vtab DB.*
30c50 2a 0a 2a 2a 20 43 61 75 73 65 20 74 68 65 20 64  *.** Cause the d
30c60 62 73 74 61 74 20 76 69 72 74 75 61 6c 20 74 61  bstat virtual ta
30c70 62 6c 65 20 74 6f 20 62 65 20 61 76 61 69 6c 61  ble to be availa
30c80 62 6c 65 20 6f 6e 20 74 68 65 20 63 6f 6e 6e 65  ble on the conne
30c90 63 74 69 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74  ction DB.*/.stat
30ca0 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69  ic int test_regi
30cb0 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
30cc0 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
30cd0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
30ce0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
30cf0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
30d00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
30d10 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
30d20 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
30d30 4c 45 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  LE.  Tcl_AppendR
30d40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64  esult(interp, "d
30d50 62 73 74 61 74 20 6e 6f 74 20 61 76 61 69 6c 61  bstat not availa
30d60 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20 22  ble because of "
30d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30d80 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c              "SQL
30d90 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
30da0 54 41 42 4c 45 22 2c 20 28 76 6f 69 64 2a 29 30  TABLE", (void*)0
30db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
30dc0 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73  ERROR;.#else.  s
30dd0 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
30de0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b   sqlite3 *db; };
30df0 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  .  char *zDb;.  
30e00 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
30e10 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  nfo;..  if( objc
30e20 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
30e30 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
30e40 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
30e50 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
30e60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
30e70 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
30e80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
30e90 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
30ea0 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
30eb0 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
30ec0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 2a 20 64  {.    sqlite3* d
30ed0 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
30ee0 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
30ef0 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
30f00 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  b;.    sqlite3Db
30f10 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29  statRegister(db)
30f20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
30f30 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  CL_OK;.#endif /*
30f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
30f50 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a  TUALTABLE */.}..
30f60 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
30f70 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
30f80 67 20 44 42 20 53 45 54 54 49 4e 47 20 56 41 4c  g DB SETTING VAL
30f90 55 45 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  UE.**.** Invoke 
30fa0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
30fb0 67 28 29 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  g() for one of t
30fc0 68 65 20 73 65 74 74 69 6e 67 20 76 61 6c 75 65  he setting value
30fd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
30fe0 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 64 62   test_sqlite3_db
30ff0 5f 63 6f 6e 66 69 67 28 0a 20 20 76 6f 69 64 20  _config(.  void 
31000 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
31010 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
31020 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
31030 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
31040 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74  objv[].){.  stat
31050 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
31060 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
31070 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
31080 20 65 56 61 6c 3b 0a 20 20 7d 20 61 53 65 74 74   eVal;.  } aSett
31090 69 6e 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ing[] = {.    { 
310a0 22 46 4b 45 59 22 2c 20 20 20 20 20 20 20 20 20  "FKEY",         
310b0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
310c0 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 7d  IG_ENABLE_FKEY }
310d0 2c 0a 20 20 20 20 7b 20 22 54 52 49 47 47 45 52  ,.    { "TRIGGER
310e0 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ",         SQLIT
310f0 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
31100 45 5f 54 52 49 47 47 45 52 20 7d 2c 0a 20 20 20  E_TRIGGER },.   
31110 20 7b 20 22 46 54 53 33 5f 54 4f 4b 45 4e 49 5a   { "FTS3_TOKENIZ
31120 45 52 22 2c 20 20 53 51 4c 49 54 45 5f 44 42 43  ER",  SQLITE_DBC
31130 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53  ONFIG_ENABLE_FTS
31140 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20  3_TOKENIZER },. 
31150 20 20 20 7b 20 22 4c 4f 41 44 5f 45 58 54 45 4e     { "LOAD_EXTEN
31160 53 49 4f 4e 22 2c 20 20 53 51 4c 49 54 45 5f 44  SION",  SQLITE_D
31170 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c  BCONFIG_ENABLE_L
31180 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 7d 2c  OAD_EXTENSION },
31190 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
311a0 20 69 6e 74 20 76 3b 0a 20 20 63 6f 6e 73 74 20   int v;.  const 
311b0 63 68 61 72 20 2a 7a 53 65 74 74 69 6e 67 3b 0a  char *zSetting;.
311c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
311d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
311e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
311f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
31200 20 6f 62 6a 76 2c 20 22 44 42 20 53 45 54 54 49   objv, "DB SETTI
31210 4e 47 20 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  NG VALUE");.    
31220 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31230 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
31240 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
31250 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
31260 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
31270 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31280 3b 0a 20 20 7a 53 65 74 74 69 6e 67 20 3d 20 54  ;.  zSetting = T
31290 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
312a0 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 73 71 6c  v[2]);.  if( sql
312b0 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 53 51  ite3_strglob("SQ
312c0 4c 49 54 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e  LITE_*", zSettin
312d0 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67  g)==0 ) zSetting
312e0 20 2b 3d 20 37 3b 0a 20 20 69 66 28 20 73 71 6c   += 7;.  if( sql
312f0 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 44 42  ite3_strglob("DB
31300 43 4f 4e 46 49 47 5f 2a 22 2c 20 7a 53 65 74 74  CONFIG_*", zSett
31310 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69  ing)==0 ) zSetti
31320 6e 67 20 2b 3d 20 39 3b 0a 20 20 69 66 28 20 73  ng += 9;.  if( s
31330 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
31340 45 4e 41 42 4c 45 5f 2a 22 2c 20 7a 53 65 74 74  ENABLE_*", zSett
31350 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69  ing)==0 ) zSetti
31360 6e 67 20 2b 3d 20 37 3b 0a 20 20 66 6f 72 28 69  ng += 7;.  for(i
31370 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
31380 61 53 65 74 74 69 6e 67 29 3b 20 69 2b 2b 29 7b  aSetting); i++){
31390 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
313a0 7a 53 65 74 74 69 6e 67 2c 20 61 53 65 74 74 69  zSetting, aSetti
313b0 6e 67 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ng[i].zName)==0 
313c0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
313d0 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( i>=ArraySize(
313e0 61 53 65 74 74 69 6e 67 29 20 29 7b 0a 20 20 20  aSetting) ){.   
313f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
31400 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20  t(interp,.      
31410 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
31420 28 22 75 6e 6b 6e 6f 77 6e 20 73 71 6c 69 74 65  ("unknown sqlite
31430 33 5f 64 62 5f 63 6f 6e 66 69 67 20 73 65 74 74  3_db_config sett
31440 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ing", -1));.    
31450 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31460 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
31470 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
31480 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
31490 76 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  v) ) return TCL_
314a0 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
314b0 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 61  _db_config(db, a
314c0 53 65 74 74 69 6e 67 5b 69 5d 2e 65 56 61 6c 2c  Setting[i].eVal,
314d0 20 76 2c 20 26 76 29 3b 0a 20 20 54 63 6c 5f 53   v, &v);.  Tcl_S
314e0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
314f0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
31500 6a 28 76 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  j(v));.  return 
31510 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
31520 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e   Register comman
31530 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20  ds with the TCL 
31540 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
31550 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f  int Sqlitetest1_
31560 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
31570 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65  *interp){.  exte
31580 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
31590 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65  earch_count;.  e
315a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
315b0 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20  3_found_count;. 
315c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
315d0 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
315e0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
315f0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66  t sqlite3_open_f
31600 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ile_count;.  ext
31610 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31620 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  sort_count;.  ex
31630 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
31640 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23  _current_time;.#
31650 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
31660 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  X && defined(__A
31670 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
31680 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
31690 5f 53 54 59 4c 45 0a 20 20 65 78 74 65 72 6e 20  _STYLE.  extern 
316a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
316b0 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20  id_num;.#endif. 
316c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
316d0 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
316e0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
316f0 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65  qlite3BtreeShare
31700 64 43 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69  dCacheReport(voi
31710 64 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d*,.            
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
31740 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63  l_Interp*,int,Tc
31750 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20  l_Obj*CONST*);. 
31760 20 73 74 61 74 69 63 20 69 6e 74 20 69 5a 65 72   static int iZer
31770 6f 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  o = 0;.  static 
31780 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
31790 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
317a0 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
317b0 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
317c0 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e   {.     { "db_en
317d0 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ter",           
317e0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
317f0 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65  CmdProc*)db_ente
31800 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
31810 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65  },.     { "db_le
31820 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ave",           
31830 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
31840 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76  CmdProc*)db_leav
31850 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
31860 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31870 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c  e3_mprintf_int",
31880 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
31890 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
318a0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  _mprintf_int    
318b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
318c0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
318d0 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ",         (Tcl_
318e0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
318f0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20  _mprintf_int64  
31900 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31910 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22  e3_mprintf_long"
31920 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
31930 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
31940 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20  _mprintf_long   
31950 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31960 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c  e3_mprintf_str",
31970 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
31980 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
31990 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20  _mprintf_str    
319a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
319b0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22  e3_snprintf_str"
319c0 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
319d0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
319e0 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20  _snprintf_str   
319f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31a00 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
31a10 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  ly",       (Tcl_
31a20 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
31a30 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
31a40 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31a50 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
31a60 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  e",        (Tcl_
31a70 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
31a80 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
31a90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31aa0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
31ab0 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  d",        (Tcl_
31ac0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
31ad0 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
31ae0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31af0 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
31b00 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d  uble",   (Tcl_Cm
31b10 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
31b20 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
31b30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31b40 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
31b50 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
31b60 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
31b70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d  rintf_z        }
31b80 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
31b90 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
31ba0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
31bb0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
31bc0 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c  intf_n        },
31bd0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31be0 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  _snprintf_int", 
31bf0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
31c00 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72  dProc*)test_snpr
31c10 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a  intf_int     },.
31c20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31c30 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
31c40 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  d",     (Tcl_Cmd
31c50 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f  Proc*)test_last_
31c60 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20  rowid       },. 
31c70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
31c80 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  xec_printf",    
31c90 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31ca0 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70  roc*)test_exec_p
31cb0 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20  rintf      },.  
31cc0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
31cd0 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20  ec_hex",        
31ce0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
31cf0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65  oc*)test_exec_he
31d00 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  x         },.   
31d10 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
31d20 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
31d30 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
31d40 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20 20  c*)test_exec    
31d50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
31d60 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
31d70 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  _nr",           
31d80 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
31d90 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20  *)test_exec_nr  
31da0 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64          },.#ifnd
31db0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
31dc0 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20  ET_TABLE.     { 
31dd0 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62  "sqlite3_get_tab
31de0 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  le_printf",     
31df0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
31e00 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  est_get_table_pr
31e10 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  intf },.#endif. 
31e20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
31e30 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
31e40 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31e50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
31e60 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
31e70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
31e80 6f 73 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20  ose_v2",        
31e90 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
31ea0 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
31eb0 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20 20  close_v2  },.   
31ec0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
31ed0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ate_function",  
31ee0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
31ef0 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66  c*)test_create_f
31f00 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20  unction  },.    
31f10 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
31f20 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20  te_aggregate",  
31f30 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
31f40 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  *)test_create_ag
31f50 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20  gregate },.     
31f60 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74  { "sqlite_regist
31f70 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
31f80 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
31f90 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66  )test_register_f
31fa0 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  unc    },.     {
31fb0 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c   "sqlite_abort",
31fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fd0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
31fe0 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20  sqlite_abort    
31ff0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
32000 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20  "sqlite_bind",  
32010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32020 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
32030 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20  est_bind        
32040 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
32050 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20  breakpoint",    
32060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32070 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
32080 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20  st_breakpoint   
32090 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
320a0 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20  qlite3_key",    
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
320c0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
320d0 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 20  t_key           
320e0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
320f0 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20  lite3_rekey",   
32100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
32110 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
32120 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20 20  _rekey          
32130 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
32140 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20  ite_set_magic", 
32150 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
32160 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
32170 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20  e_set_magic     
32180 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32190 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20  te3_interrupt", 
321a0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
321b0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69  _CmdProc*)test_i
321c0 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20 20  nterrupt        
321d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
321e0 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  e_delete_functio
321f0 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  n",        (Tcl_
32200 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
32210 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d  function       }
32220 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
32230 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  _delete_collatio
32240 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  n",       (Tcl_C
32250 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63  mdProc*)delete_c
32260 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c  ollation      },
32270 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32280 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22  _get_autocommit"
32290 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
322a0 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63  dProc*)get_autoc
322b0 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a  ommit        },.
322c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
322d0 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20 20  stack_used",    
322e0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
322f0 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63 6b  Proc*)test_stack
32300 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a 20  _used       },. 
32310 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
32320 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20  usy_timeout",   
32330 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
32340 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74  roc*)test_busy_t
32350 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20  imeout     },.  
32360 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20     { "printf",  
32370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32380 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32390 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20  oc*)test_printf 
323a0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
323b0 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72    { "sqlite3IoTr
323c0 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ace",           
323d0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
323e0 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20  )test_io_trace  
323f0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
32400 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65   "clang_sanitize
32410 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20 20 20  _address",      
32420 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
32430 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61  clang_sanitize_a
32440 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20  ddress },.  };. 
32450 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
32460 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
32470 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43  e;.     Tcl_ObjC
32480 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20  mdProc *xProc;. 
32490 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74      void *client
324a0 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d  Data;.  } aObjCm
324b0 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
324c0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
324d0 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
324e0 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f  test_sqlite3_db_
324f0 63 6f 6e 66 69 67 2c 20 30 20 7d 2c 0a 20 20 20  config, 0 },.   
32500 20 20 7b 20 22 62 61 64 5f 62 65 68 61 76 69 6f    { "bad_behavio
32510 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
32520 20 20 20 20 20 74 65 73 74 5f 62 61 64 5f 62 65       test_bad_be
32530 68 61 76 69 6f 72 2c 20 20 28 76 6f 69 64 2a 29  havior,  (void*)
32540 26 69 5a 65 72 6f 20 7d 2c 0a 20 20 20 20 20 7b  &iZero },.     {
32550 20 22 72 65 67 69 73 74 65 72 5f 64 62 73 74 61   "register_dbsta
32560 74 5f 76 74 61 62 22 2c 20 20 20 20 20 20 20 20  t_vtab",        
32570 20 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f    test_register_
32580 64 62 73 74 61 74 5f 76 74 61 62 20 20 7d 2c 0a  dbstat_vtab  },.
32590 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
325a0 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74  connection_point
325b0 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71 6c 69  er",    get_sqli
325c0 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c  te_pointer, 0 },
325d0 0a 20 20 20 20 20 7b 20 22 69 6e 74 61 72 72 61  .     { "intarra
325e0 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20 20  y_addr",        
325f0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 6e           test_in
32600 74 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20 7d  tarray_addr, 0 }
32610 2c 0a 20 20 20 20 20 7b 20 22 69 6e 74 36 34 61  ,.     { "int64a
32620 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20  rray_addr",     
32630 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69            test_i
32640 6e 74 36 34 61 72 72 61 79 5f 61 64 64 72 2c 20  nt64array_addr, 
32650 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 6f 75  0 },.     { "dou
32660 62 6c 65 61 72 72 61 79 5f 61 64 64 72 22 2c 20  blearray_addr", 
32670 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
32680 74 5f 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64  t_doublearray_ad
32690 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  dr, 0 },.     { 
326a0 22 74 65 78 74 61 72 72 61 79 5f 61 64 64 72 22  "textarray_addr"
326b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
326c0 20 74 65 73 74 5f 74 65 78 74 61 72 72 61 79 5f   test_textarray_
326d0 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20  addr, 0 },.     
326e0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
326f0 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
32700 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
32710 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ,      0 },.    
32720 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
32730 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20  _zeroblob",     
32740 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65      test_bind_ze
32750 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20  roblob, 0 },.   
32760 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
32770 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 22 2c 20 20  d_zeroblob64",  
32780 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
32790 65 72 6f 62 6c 6f 62 36 34 2c 20 30 20 7d 2c 0a  eroblob64, 0 },.
327a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
327b0 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20  bind_int64",    
327c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
327d0 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c  d_int64,    0 },
327e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
327f0 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20  _bind_double",  
32800 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
32810 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d  nd_double,   0 }
32820 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
32830 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20  3_bind_null",   
32840 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
32850 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20  ind_null     ,0 
32860 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
32870 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20  e3_bind_text",  
32880 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
32890 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30  bind_text     ,0
328a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
328b0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22  te3_bind_text16"
328c0 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
328d0 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c  _bind_text16   ,
328e0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
328f0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c  ite3_bind_blob",
32900 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
32910 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20  t_bind_blob     
32920 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
32930 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
32940 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65  eter_count",  te
32950 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
32960 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20  r_count, 0},.   
32970 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
32980 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
32990 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  ",   test_bind_p
329a0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20  arameter_name,  
329b0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
329c0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
329d0 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74  er_index",  test
329e0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
329f0 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20  index, 0},.     
32a00 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  { "sqlite3_clear
32a10 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20  _bindings",     
32a20 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69     test_clear_bi
32a30 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20  ndings, 0},.    
32a40 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65   { "sqlite3_slee
32a50 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
32a60 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20      test_sleep, 
32a70 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20           0},.   
32a80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
32a90 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
32aa0 20 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64       test_errcod
32ab0 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e       ,0 },.  
32ac0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
32ad0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c  tended_errcode",
32ae0 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72        test_ex_er
32af0 72 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20  rcode    ,0 },. 
32b00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
32b10 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20  rrmsg",         
32b20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d         test_errm
32b30 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  sg        ,0 },.
32b40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32b50 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20  errmsg16",      
32b60 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
32b70 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c  msg16      ,0 },
32b80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32b90 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  _open",         
32ba0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
32bb0 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  en          ,0 }
32bc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
32bd0 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20  3_open16",      
32be0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
32bf0 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20  pen16        ,0 
32c00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
32c10 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20  e3_open_v2",    
32c20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
32c30 6f 70 65 6e 5f 76 32 20 20 20 20 20 20 20 2c 30  open_v2       ,0
32c40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32c50 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c  te3_complete16",
32c60 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
32c70 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c  _complete16    ,
32c80 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
32c90 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20  lite3_prepare", 
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
32cb0 73 74 5f 70 72 65 70 61 72 65 20 20 20 20 20 20  st_prepare      
32cc0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
32cd0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
32ce0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
32cf0 65 73 74 5f 70 72 65 70 61 72 65 31 36 20 20 20  est_prepare16   
32d00 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
32d10 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
32d20 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
32d30 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20  test_prepare_v2 
32d40 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
32d50 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
32d60 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20  _tkt3134",      
32d70 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b   test_prepare_tk
32d80 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20  t3134, 0},.     
32d90 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
32da0 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20  re16_v2",       
32db0 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 31     test_prepare1
32dc0 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20  6_v2  ,0 },.    
32dd0 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61   { "sqlite3_fina
32de0 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  lize",          
32df0 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a      test_finaliz
32e00 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  e      ,0 },.   
32e10 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d    { "sqlite3_stm
32e20 74 5f 73 74 61 74 75 73 22 2c 20 20 20 20 20 20  t_status",      
32e30 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73       test_stmt_s
32e40 74 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20  tatus   ,0 },.  
32e50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65     { "sqlite3_re
32e60 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  set",           
32e70 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65 74        test_reset
32e80 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
32e90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
32ea0 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20 20  xpired",        
32eb0 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70 69         test_expi
32ec0 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  red       ,0 },.
32ed0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32ee0 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67  transfer_binding
32ef0 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61  s",     test_tra
32f00 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c  nsfer_bind ,0 },
32f10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32f20 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  _changes",      
32f30 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 68           test_ch
32f40 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d  anges       ,0 }
32f50 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
32f60 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20 20  3_step",        
32f70 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
32f80 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30 20  tep          ,0 
32f90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
32fa0 65 33 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20  e3_sql",        
32fb0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
32fc0 73 71 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30  sql           ,0
32fd0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32fe0 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20  te3_next_stmt", 
32ff0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
33000 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c  _next_stmt     ,
33010 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
33020 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
33030 6c 79 22 2c 20 20 20 20 20 20 20 20 20 74 65 73  ly",         tes
33040 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20  t_stmt_readonly 
33050 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
33060 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 22  lite3_stmt_busy"
33070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
33080 73 74 5f 73 74 6d 74 5f 62 75 73 79 20 20 20 20  st_stmt_busy    
33090 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75   ,0 },.     { "u
330a0 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c  ses_stmt_journal
330b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 75  ",             u
330c0 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c  ses_stmt_journal
330d0 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22   ,0 },..     { "
330e0 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
330f0 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20  memory",        
33100 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  test_release_mem
33110 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  ory,     0},.   
33120 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f    { "sqlite3_db_
33130 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c  release_memory",
33140 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65 6c       test_db_rel
33150 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d  ease_memory,  0}
33160 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33170 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 22  3_db_cacheflush"
33180 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64  ,         test_d
33190 62 5f 63 61 63 68 65 66 6c 75 73 68 2c 20 20 20  b_cacheflush,   
331a0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
331b0 71 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72  qlite3_system_er
331c0 72 6e 6f 22 2c 20 20 20 20 20 20 20 20 20 20 74  rno",          t
331d0 65 73 74 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f  est_system_errno
331e0 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
331f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 66   { "sqlite3_db_f
33200 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20 20 20  ilename",       
33210 20 20 20 20 74 65 73 74 5f 64 62 5f 66 69 6c 65      test_db_file
33220 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30 7d 2c  name,        0},
33230 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33240 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20  _db_readonly",  
33250 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62           test_db
33260 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20 20 20  _readonly,      
33270 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
33280 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
33290 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74 65  limit",       te
332a0 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  st_soft_heap_lim
332b0 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  it,    0},.     
332c0 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65 61  { "sqlite3_threa
332d0 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20 20  d_cleanup",     
332e0 20 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63     test_thread_c
332f0 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a  leanup,     0},.
33300 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33310 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 22  pager_refcounts"
33320 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 61 67  ,       test_pag
33330 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20 20  er_refcounts,   
33340 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71   0},..     { "sq
33350 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
33360 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74 65  sion",        te
33370 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  st_load_extensio
33380 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  n,     0},.     
33390 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  { "sqlite3_enabl
333a0 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
333b0 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c  ", test_enable_l
333c0 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  oad,        0},.
333d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
333e0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
333f0 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78 74  codes", test_ext
33400 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
33410 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  es, 0},.     { "
33420 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20  sqlite3_limit", 
33430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33440 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20  test_limit,     
33450 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a              0},.
33460 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70 72  .     { "save_pr
33470 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20  ng_state",      
33480 20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70 72           save_pr
33490 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20 7d  ng_state,    0 }
334a0 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f 72  ,.     { "restor
334b0 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  e_prng_state",  
334c0 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72            restor
334d0 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30 20  e_prng_state, 0 
334e0 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65 74  },.     { "reset
334f0 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
33500 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 74             reset
33510 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 30  _prng_state,   0
33520 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61   },.     { "data
33530 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75  base_never_corru
33540 70 74 22 2c 20 20 20 20 20 20 20 20 64 61 74 61  pt",        data
33550 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75  base_never_corru
33560 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  pt, 0},.     { "
33570 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f  database_may_be_
33580 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20 20  corrupt",       
33590 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f  database_may_be_
335a0 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20  corrupt, 0},.   
335b0 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f    { "optimizatio
335c0 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20 20 20  n_control",     
335d0 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f       optimizatio
335e0 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a 23 69  n_control,0},.#i
335f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
33600 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77 69 6e       { "lock_win
33610 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20  32_file",       
33620 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66 69          win32_fi
33630 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20 7d 2c  le_lock,    0 },
33640 0a 20 20 20 20 20 7b 20 22 65 78 69 73 74 73 5f  .     { "exists_
33650 77 69 6e 33 32 5f 70 61 74 68 22 2c 20 20 20 20  win32_path",    
33660 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 65           win32_e
33670 78 69 73 74 73 5f 70 61 74 68 2c 20 20 30 20 7d  xists_path,  0 }
33680 2c 0a 20 20 20 20 20 7b 20 22 66 69 6e 64 5f 77  ,.     { "find_w
33690 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20  in32_file",     
336a0 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
336b0 66 69 6e 64 5f 66 69 6c 65 2c 20 20 20 20 30 20  find_file,    0 
336c0 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 6c 65 74  },.     { "delet
336d0 65 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20  e_win32_file",  
336e0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
336f0 5f 64 65 6c 65 74 65 5f 66 69 6c 65 2c 20 20 30  _delete_file,  0
33700 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61 6b 65   },.     { "make
33710 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20 20 20  _win32_dir",    
33720 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
33730 32 5f 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20  2_mkdir,        
33740 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 6d  0 },.     { "rem
33750 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20  ove_win32_dir", 
33760 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
33770 33 32 5f 72 6d 64 69 72 2c 20 20 20 20 20 20 20  32_rmdir,       
33780 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20   0 },.#endif.   
33790 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72 6f 63    { "tcl_objproc
337a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
337b0 20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50 72 6f       runAsObjPro
337c0 63 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 20  c,       0 },.. 
337d0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63      /* sqlite3_c
337e0 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f  olumn_*() API */
337f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33800 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20  _column_count", 
33810 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
33820 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d  lumn_count  ,0 }
33830 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33840 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20  3_data_count",  
33850 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64            test_d
33860 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20  ata_count    ,0 
33870 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
33880 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c  e3_column_type",
33890 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
338a0 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30  column_type   ,0
338b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
338c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22  te3_column_blob"
338d0 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
338e0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c  _column_blob   ,
338f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
33900 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
33910 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74 65 73  le",         tes
33920 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20  t_column_double 
33930 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
33940 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
33950 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  64",          te
33960 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20  st_column_int64 
33970 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
33980 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
33990 78 74 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74  xt",   test_stmt
339a0 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73  _utf8,  (void*)s
339b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
339c0 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  xt },.     { "sq
339d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
339e0 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  e",   test_stmt_
339f0 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71  utf8,  (void*)sq
33a00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
33a10 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  e },.     { "sql
33a20 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22  ite3_column_int"
33a30 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69  ,    test_stmt_i
33a40 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c  nt,   (void*)sql
33a50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20  ite3_column_int 
33a60 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
33a70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
33a80 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e  ",  test_stmt_in
33a90 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69  t,   (void*)sqli
33aa0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
33ab0 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
33ac0 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
33ad0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33ae0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22  column_decltype"
33af0 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c  ,test_stmt_utf8,
33b00 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
33b10 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d 2c  olumn_decltype},
33b20 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
33b30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
33b40 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20 22  UMN_METADATA.{ "
33b50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
33b60 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c 74 65  atabase_name",te
33b70 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f  st_stmt_utf8,(vo
33b80 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
33b90 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
33ba0 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f  },.{ "sqlite3_co
33bb0 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22  lumn_table_name"
33bc0 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c  ,test_stmt_utf8,
33bd0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
33be0 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
33bf0 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f  },.{ "sqlite3_co
33c00 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
33c10 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
33c20 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
33c30 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
33c40 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  me},.#endif..#if
33c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33c60 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 73  _UTF16.     { "s
33c70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
33c80 74 65 73 31 36 22 2c 20 74 65 73 74 5f 73 74 6d  tes16", test_stm
33c90 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29 73 71  t_int, (void*)sq
33ca0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
33cb0 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20 22  es16 },.     { "
33cc0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
33cd0 65 78 74 31 36 22 2c 20 20 74 65 73 74 5f 73 74  ext16",  test_st
33ce0 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a  mt_utf16, (void*
33cf0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
33d00 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20 7b 20  text16},.     { 
33d10 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
33d20 6e 61 6d 65 31 36 22 2c 20 20 74 65 73 74 5f 73  name16",  test_s
33d30 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
33d40 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
33d50 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20 20 7b  _name16},.     {
33d60 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f   "add_alignment_
33d70 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22  test_collations"
33d80 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f  , add_alignment_
33d90 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c  test_collations,
33da0 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64   0      },.#ifnd
33db0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
33dc0 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22  ECLTYPE.     { "
33dd0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
33de0 65 63 6c 74 79 70 65 31 36 22 2c 74 65 73 74 5f  ecltype16",test_
33df0 73 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f 69 64  stmt_utf16,(void
33e00 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
33e10 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23 65  _decltype16},.#e
33e20 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
33e30 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
33e40 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c 69  _METADATA.{"sqli
33e50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
33e60 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74  ase_name16",.  t
33e70 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
33e80 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
33e90 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
33ea0 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65  ame16},.{"sqlite
33eb0 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
33ec0 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d  ame16", test_stm
33ed0 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
33ee0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
33ef0 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22  able_name16},.{"
33f00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
33f10 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74  rigin_name16", t
33f20 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
33f30 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
33f40 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
33f50 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e  e16},.#endif.#en
33f60 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
33f70 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
33f80 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63  tion_v2", test_c
33f90 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
33fa0 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  v2, 0 },.     { 
33fb0 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f  "sqlite3_global_
33fc0 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65  recover",     te
33fd0 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  st_global_recove
33fe0 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  r, 0   },.     {
33ff0 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f   "working_64bit_
34000 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 77  int",          w
34010 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
34020 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
34030 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65  { "vfs_unlink_te
34040 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  st",            
34050 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c  vfs_unlink_test,
34060 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20       0   },.    
34070 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69 6c   { "vfs_initfail
34080 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
34090 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65   vfs_initfail_te
340a0 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  st,   0   },.   
340b0 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69 73    { "vfs_unregis
340c0 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20  ter_all",       
340d0 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72    vfs_unregister
340e0 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20  _all,  0   },.  
340f0 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67 69     { "vfs_reregi
34100 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20  ster_all",      
34110 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65     vfs_reregiste
34120 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20  r_all,  0   },. 
34130 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
34140 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20  rol_test",      
34150 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c      file_control
34160 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a  _test,   0   },.
34170 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
34180 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74  trol_lasterrno_t
34190 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72  est", file_contr
341a0 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73  ol_lasterrno_tes
341b0 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  t,  0   },.     
341c0 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
341d0 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 22 2c  lockproxy_test",
341e0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f   file_control_lo
341f0 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20 20 30  ckproxy_test,  0
34200 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
34210 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
34220 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c 65  size_test", file
34230 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69  _control_chunksi
34240 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  ze_test,  0   },
34250 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
34260 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
34270 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74  est",  file_cont
34280 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
34290 74 2c 20 20 20 30 20 20 20 7d 2c 0a 23 69 66 20  t,   0   },.#if 
342a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
342b0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
342c0 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72  ol_win32_av_retr
342d0 79 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  y", file_control
342e0 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c  _win32_av_retry,
342f0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
34300 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69  "file_control_wi
34310 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 22 2c  n32_set_handle",
34320 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
34330 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 2c 20  n32_set_handle, 
34340 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20  0  },.#endif.   
34350 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
34360 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22 2c 20  l_persist_wal", 
34370 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
34380 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20 20 20  persist_wal,    
34390 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
343a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
343b0 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
343c0 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  ",file_control_p
343d0 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
343e0 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22 66  te,0},.     { "f
343f0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
34400 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66 69 6c  ame",        fil
34410 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d  e_control_vfsnam
34420 65 2c 20 20 20 20 20 20 20 20 20 30 20 20 20 7d  e,         0   }
34430 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
34440 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e  ontrol_tempfilen
34450 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63 6f 6e  ame",   file_con
34460 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d  trol_tempfilenam
34470 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  e,    0   },.   
34480 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73    { "sqlite3_vfs
34490 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20 20  _list",         
344a0 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20    vfs_list,     
344b0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  0   },.     { "s
344c0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
344d0 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74  nction_v2", test
344e0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
344f0 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20 20 20  _v2, 0 },..     
34500 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f  /* Functions fro
34510 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65  m os.h */.#ifnde
34520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
34530 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64 5f  F16.     { "add_
34540 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20  test_collate",  
34550 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61        test_colla
34560 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 20 20  te, 0           
34570 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
34580 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
34590 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  ded", test_colla
345a0 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20 20  te_needed, 0    
345b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
345c0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
345d0 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63 74        test_funct
345e0 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20 20  ion, 0          
345f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
34600 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f  test_utf16bin_co
34610 6c 6c 61 74 65 22 2c 20 20 20 20 74 65 73 74 5f  llate",    test_
34620 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
34630 2c 20 30 20 20 20 20 20 20 20 20 7d 2c 0a 23 65  , 0        },.#e
34640 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
34650 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72  ite3_test_errstr
34660 22 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72 73  ",     test_errs
34670 74 72 2c 20 30 20 20 20 20 20 20 20 20 20 20 20  tr, 0           
34680 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c    },.     { "tcl
34690 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c  _variable_type",
346a0 20 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61         tcl_varia
346b0 62 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20  ble_type, 0     
346c0 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    },.#ifndef SQL
346d0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
346e0 43 41 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71  CACHE.     { "sq
346f0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
34700 72 65 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74  red_cache", test
34710 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20  _enable_shared, 
34720 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
34730 6c 69 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63  lite3_shared_cac
34740 68 65 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69  he_report", sqli
34750 74 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61  te3BtreeSharedCa
34760 63 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23  cheReport, 0},.#
34770 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
34780 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
34790 5f 6e 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c  _number", test_l
347a0 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
347b0 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
347c0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
347d0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20  lumn_metadata", 
347e0 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
347f0 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20 7d  n_metadata, 0  }
34800 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
34810 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
34820 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
34830 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65 73  lob_reopen", tes
34840 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20 30  t_blob_reopen, 0
34850 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
34860 20 7b 20 22 70 63 61 63 68 65 5f 73 74 61 74 73   { "pcache_stats
34870 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 63  ",       test_pc
34880 61 63 68 65 5f 73 74 61 74 73 2c 20 30 20 20 7d  ache_stats, 0  }
34890 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
348a0 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
348b0 54 49 46 59 0a 20 20 20 20 20 7b 20 22 73 71 6c  TIFY.     { "sql
348c0 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
348d0 66 79 22 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  fy", test_unlock
348e0 5f 6e 6f 74 69 66 79 2c 20 30 20 20 7d 2c 0a 23  _notify, 0  },.#
348f0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
34900 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
34910 6f 69 6e 74 22 2c 20 20 20 74 65 73 74 5f 77 61  oint",   test_wa
34920 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20  l_checkpoint, 0 
34930 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
34940 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
34950 6e 74 5f 76 32 22 2c 74 65 73 74 5f 77 61 6c 5f  nt_v2",test_wal_
34960 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 2c 20 30  checkpoint_v2, 0
34970 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
34980 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
34990 63 6b 70 6f 69 6e 74 22 2c 74 65 73 74 5f 77 61  ckpoint",test_wa
349a0 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
349b0 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
349c0 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67  test_sqlite3_log
349d0 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
349e0 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20 30 20 20  sqlite3_log, 0  
349f0 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
34a00 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
34a10 20 20 20 20 7b 20 22 70 72 69 6e 74 5f 65 78 70      { "print_exp
34a20 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61 6e 22  lain_query_plan"
34a30 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70  , test_print_eqp
34a40 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
34a50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
34a60 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c 20 74 65  est_control", te
34a70 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20  st_test_control 
34a80 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  },.#if SQLITE_OS
34a90 5f 55 4e 49 58 0a 20 20 20 20 20 7b 20 22 67 65  _UNIX.     { "ge
34aa0 74 72 75 73 61 67 65 22 2c 20 74 65 73 74 5f 67  trusage", test_g
34ab0 65 74 72 75 73 61 67 65 20 7d 2c 0a 23 65 6e 64  etrusage },.#end
34ac0 69 66 0a 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f  if.     { "load_
34ad0 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  static_extension
34ae0 22 2c 20 74 63 6c 4c 6f 61 64 53 74 61 74 69 63  ", tclLoadStatic
34af0 45 78 74 65 6e 73 69 6f 6e 43 6d 64 20 7d 2c 0a  ExtensionCmd },.
34b00 20 20 20 20 20 7b 20 22 73 6f 72 74 65 72 5f 74       { "sorter_t
34b10 65 73 74 5f 66 61 6b 65 68 65 61 70 22 2c 20 73  est_fakeheap", s
34b20 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68  orter_test_fakeh
34b30 65 61 70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  eap },.     { "s
34b40 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34  orter_test_sort4
34b50 5f 68 65 6c 70 65 72 22 2c 20 73 6f 72 74 65 72  _helper", sorter
34b60 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70  _test_sort4_help
34b70 65 72 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  er },.#ifdef SQL
34b80 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
34b90 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 7b 20 22  ICATION.     { "
34ba0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74  sqlite3_user_aut
34bb0 68 65 6e 74 69 63 61 74 65 22 2c 20 74 65 73 74  henticate", test
34bc0 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61  _user_authentica
34bd0 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  te, 0 },.     { 
34be0 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64  "sqlite3_user_ad
34bf0 64 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  d",          tes
34c00 74 5f 75 73 65 72 5f 61 64 64 2c 20 20 20 20 20  t_user_add,     
34c10 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b       0 },.     {
34c20 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63   "sqlite3_user_c
34c30 68 61 6e 67 65 22 2c 20 20 20 20 20 20 20 74 65  hange",       te
34c40 73 74 5f 75 73 65 72 5f 63 68 61 6e 67 65 2c 20  st_user_change, 
34c50 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
34c60 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  { "sqlite3_user_
34c70 64 65 6c 65 74 65 22 2c 20 20 20 20 20 20 20 74  delete",       t
34c80 65 73 74 5f 75 73 65 72 5f 64 65 6c 65 74 65 2c  est_user_delete,
34c90 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
34ca0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
34cb0 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
34cc0 4e 53 54 41 54 55 53 0a 20 20 20 20 20 7b 20 22  NSTATUS.     { "
34cd0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
34ce0 6e 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20  nstatus",       
34cf0 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74  test_stmt_scanst
34d00 61 74 75 73 2c 20 20 20 30 20 7d 2c 0a 20 20 20  atus,   0 },.   
34d10 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d    { "sqlite3_stm
34d20 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73  t_scanstatus_res
34d30 65 74 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 73  et", test_stmt_s
34d40 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 2c  canstatus_reset,
34d50 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
34d60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
34d70 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 20  BLE_SQLLOG.     
34d80 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  { "sqlite3_confi
34d90 67 5f 73 71 6c 6c 6f 67 22 2c 20 20 20 20 20 20  g_sqllog",      
34da0 20 20 20 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73     test_config_s
34db0 71 6c 6c 6f 67 2c 20 20 20 30 20 7d 2c 0a 23 65  qllog,   0 },.#e
34dc0 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 76 66 73  ndif.     { "vfs
34dd0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 5f 69 6e  _current_time_in
34de0 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 20  t64",           
34df0 76 66 73 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  vfsCurrentTimeIn
34e00 74 36 34 2c 20 20 20 30 20 7d 2c 0a 23 69 66 64  t64,   0 },.#ifd
34e10 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
34e20 5f 53 4e 41 50 53 48 4f 54 0a 20 20 20 20 20 7b  _SNAPSHOT.     {
34e30 20 22 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68   "sqlite3_snapsh
34e40 6f 74 5f 67 65 74 22 2c 20 74 65 73 74 5f 73 6e  ot_get", test_sn
34e50 61 70 73 68 6f 74 5f 67 65 74 2c 20 30 20 7d 2c  apshot_get, 0 },
34e60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34e70 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 22 2c  _snapshot_open",
34e80 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 6f   test_snapshot_o
34e90 70 65 6e 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  pen, 0 },.     {
34ea0 20 22 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68   "sqlite3_snapsh
34eb0 6f 74 5f 66 72 65 65 22 2c 20 74 65 73 74 5f 73  ot_free", test_s
34ec0 6e 61 70 73 68 6f 74 5f 66 72 65 65 2c 20 30 20  napshot_free, 0 
34ed0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34ee0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 22  e3_snapshot_cmp"
34ef0 2c 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f  , test_snapshot_
34f00 63 6d 70 2c 20 30 20 7d 2c 0a 23 65 6e 64 69 66  cmp, 0 },.#endif
34f10 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69  .  };.  static i
34f20 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20  nt bitmask_size 
34f30 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  = sizeof(Bitmask
34f40 29 2a 38 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  )*8;.  static in
34f50 74 20 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73 69 7a  t longdouble_siz
34f60 65 20 3d 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44  e = sizeof(LONGD
34f70 4f 55 42 4c 45 5f 54 59 50 45 29 3b 0a 20 20 69  OUBLE_TYPE);.  i
34f80 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69  nt i;.  extern i
34f90 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  nt sqlite3_sync_
34fa0 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66  count, sqlite3_f
34fb0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20  ullsync_count;. 
34fc0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
34fd0 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
34fe0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
34ff0 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f   sqlite3_like_co
35000 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
35010 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70  t sqlite3_xferop
35020 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  t_count;.  exter
35030 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  n int sqlite3_pa
35040 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
35050 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
35060 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
35070 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  tedb_count;.  ex
35080 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
35090 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
350a0 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  unt;.#if SQLITE_
350b0 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e 20  OS_WIN.  extern 
350c0 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65 20 73 71  LONG volatile sq
350d0 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23  lite3_os_type;.#
350e0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
350f0 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74 65  ITE_DEBUG.  exte
35100 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68  rn int sqlite3Wh
35110 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74 65  ereTrace;.  exte
35120 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53  rn int sqlite3OS
35130 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20  Trace;.  extern 
35140 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 54 72  int sqlite3WalTr
35150 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ace;.#endif.#ifd
35160 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
35170 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
35180 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65 72  BLE_FTS3.  exter
35190 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74  n int sqlite3_ft
351a0 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
351b0 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65  heses;.#endif.#e
351c0 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ndif..  for(i=0;
351d0 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f   i<sizeof(aCmd)/
351e0 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b  sizeof(aCmd[0]);
351f0 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
35200 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
35210 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61  erp, aCmd[i].zNa
35220 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f  me, aCmd[i].xPro
35230 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  c, 0, 0);.  }.  
35240 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
35250 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f  f(aObjCmd)/sizeo
35260 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69  f(aObjCmd[0]); i
35270 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
35280 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
35290 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  terp, aObjCmd[i]
352a0 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
352b0 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f   aObjCmd[i].xPro
352c0 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c  c, aObjCmd[i].cl
352d0 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20  ientData, 0);.  
352e0 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  }.  Tcl_LinkVar(
352f0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
35300 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a  search_count", .
35310 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
35320 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
35330 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
35340 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
35350 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
35360 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a  _found_count", .
35370 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
35380 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e  lite3_found_coun
35390 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
353a0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
353b0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
353c0 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  sort_count", .  
353d0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
353e0 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20  te3_sort_count, 
353f0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
35400 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
35410 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61  erp, "sqlite3_ma
35420 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20  x_blobsize", .  
35430 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
35440 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
35450 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
35460 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
35470 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
35480 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ike_count", .   
35490 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
354a0 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54  e3_like_count, T
354b0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
354c0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
354d0 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65  rp, "sqlite_inte
354e0 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  rrupt_count", . 
354f0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
35500 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
35510 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
35520 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
35530 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
35540 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
35550 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
35560 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
35570 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  _file_count, TCL
35580 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
35590 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
355a0 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  , "sqlite_curren
355b0 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20  t_time", .      
355c0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
355d0 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43  current_time, TC
355e0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66  L_LINK_INT);.#if
355f0 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
35600 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
35610 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
35620 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
35630 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TYLE.  Tcl_LinkV
35640 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
35650 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20  te_hostid_num", 
35660 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
35670 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
35680 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  m, TCL_LINK_INT)
35690 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
356a0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
356b0 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
356c0 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
356d0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66  har*)&sqlite3_xf
356e0 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  eropt_count, TCL
356f0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
35700 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
35710 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
35720 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a  _readdb_count",.
35730 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
35740 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
35750 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  db_count, TCL_LI
35760 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
35770 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
35780 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
35790 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20  itedb_count",.  
357a0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
357b0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
357c0 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  b_count, TCL_LIN
357d0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
357e0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
357f0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
35800 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  tej_count",.    
35810 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
35820 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
35830 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
35840 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
35850 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
35860 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
35870 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f  erp, "unaligned_
35880 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c  string_counter",
35890 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75  .      (char*)&u
358a0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
358b0 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e  counter, TCL_LIN
358c0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
358d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
358e0 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c  IT_UTF16.  Tcl_L
358f0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
35900 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64  sqlite_last_need
35910 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20  ed_collation",. 
35920 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e       (char*)&pzN
35930 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20  eededCollation, 
35940 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c  TCL_LINK_STRING|
35950 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
35960 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  LY);.#endif.#if 
35970 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
35980 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
35990 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
359a0 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ype",.      (cha
359b0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
359c0 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 4c 4f  ype, TCL_LINK_LO
359d0 4e 47 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  NG);.#endif.#ifd
359e0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
359f0 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
35a00 6e 73 74 20 63 68 61 72 20 2a 71 75 65 72 79 5f  nst char *query_
35a10 70 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f 42 53 4f  plan = "*** OBSO
35a20 4c 45 54 45 20 56 41 52 49 41 42 4c 45 20 2a 2a  LETE VARIABLE **
35a30 2a 22 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 6e 6b  *";.    Tcl_Link
35a40 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
35a50 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c  ite_query_plan",
35a60 0a 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  .       (char*)&
35a70 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f  query_plan, TCL_
35a80 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f  LINK_STRING|TCL_
35a90 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b  LINK_READ_ONLY);
35aa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
35ab0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
35ac0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
35ad0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 68  terp, "sqlite_wh
35ae0 65 72 65 5f 74 72 61 63 65 22 2c 0a 20 20 20 20  ere_trace",.    
35af0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
35b00 33 57 68 65 72 65 54 72 61 63 65 2c 20 54 43 4c  3WhereTrace, TCL
35b10 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
35b20 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
35b30 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61  , "sqlite_os_tra
35b40 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ce",.      (char
35b50 2a 29 26 73 71 6c 69 74 65 33 4f 53 54 72 61 63  *)&sqlite3OSTrac
35b60 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
35b70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
35b80 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54 63 6c 5f  _OMIT_WAL.  Tcl_
35b90 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
35ba0 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74 72 61 63  "sqlite_wal_trac
35bb0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
35bc0 29 26 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63  )&sqlite3WalTrac
35bd0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
35be0 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ;.#endif.#endif.
35bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35c00 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c  MIT_DISKIO.  Tcl
35c10 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
35c20 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d   "sqlite_opentem
35c30 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  p_count",.      
35c40 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
35c50 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20  opentemp_count, 
35c60 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
35c70 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b  endif.  Tcl_Link
35c80 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
35c90 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
35ca0 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20 28 63  value",.      (c
35cb0 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61  har*)&sqlite_sta
35cc0 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20  tic_bind_value, 
35cd0 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29  TCL_LINK_STRING)
35ce0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
35cf0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
35d00 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
35d10 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
35d20 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  )&sqlite_static_
35d30 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f  bind_nbyte, TCL_
35d40 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
35d50 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
35d60 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69   "sqlite_temp_di
35d70 72 65 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20  rectory",.      
35d80 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
35d90 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 20  temp_directory, 
35da0 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29  TCL_LINK_STRING)
35db0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
35dc0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
35dd0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 22 2c  data_directory",
35de0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
35df0 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
35e00 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  ctory, TCL_LINK_
35e10 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c  STRING);.  Tcl_L
35e20 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
35e30 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20  bitmask_size",. 
35e40 20 20 20 20 20 28 63 68 61 72 2a 29 26 62 69 74       (char*)&bit
35e50 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c  mask_size, TCL_L
35e60 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b  INK_INT|TCL_LINK
35e70 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54  _READ_ONLY);.  T
35e80 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
35e90 70 2c 20 22 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73  p, "longdouble_s
35ea0 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ize",.      (cha
35eb0 72 2a 29 26 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73  r*)&longdouble_s
35ec0 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ize, TCL_LINK_IN
35ed0 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  T|TCL_LINK_READ_
35ee0 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  ONLY);.  Tcl_Lin
35ef0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
35f00 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 22  lite_sync_count"
35f10 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
35f20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
35f30 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
35f40 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
35f50 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
35f60 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 22  _fullsync_count"
35f70 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
35f80 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
35f90 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
35fa0 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65 66 69 6e  _INT);.#if defin
35fb0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
35fc0 5f 46 54 53 33 29 20 26 26 20 64 65 66 69 6e 65  _FTS3) && define
35fd0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
35fe0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
35ff0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 74 73  erp, "sqlite_fts
36000 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68  3_enable_parenth
36010 65 73 65 73 22 2c 0a 20 20 20 20 20 20 28 63 68  eses",.      (ch
36020 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 74 73  ar*)&sqlite3_fts
36030 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68  3_enable_parenth
36040 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  eses, TCL_LINK_I
36050 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  NT);.#endif.  re
36060 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a     turn TCL_OK;.}.