/ Hex Artifact Content
Login

Artifact 5445032d4f1de27138802b26d8908fc3af028ba3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0280: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02b0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
02c0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02d0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02e0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02f0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
0300: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
0310: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
0320: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0330: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0340: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0350: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0360: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0370: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0380: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0390: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
03a0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
03b0: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
03c0: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03d0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03e0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03f0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
0400: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
0410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
0420: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0430: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0440: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0450: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0460: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0470: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0480: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0490: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
04a0: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
04b0: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
04c0: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04d0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04e0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04f0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
0500: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0510: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0520: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0530: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0540: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0550: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0560: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0570: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0580: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0590: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
05a0: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05b0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05c0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05d0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05f0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
0600: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0610: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0620: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0630: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0640: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0650: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0660: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0670: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0680: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0690: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
06a0: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06b0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06c0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06d0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06e0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06f0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
0700: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0710: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0720: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0740: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0750: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0760: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0770: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0780: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0790: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
07a0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07e0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07f0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
0800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0810: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0820: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0830: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0840: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0850: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0870: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0880: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0890: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
08a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08e0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08f0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0900: 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ata;.  sqlite3_s
0910: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
0920: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 22  Buf), zBuf, "%p"
0930: 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 54 63 6c 5f  , p->db);.  Tcl_
0940: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0950: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
0960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0970: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
0990: 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a  sqlite3 object..
09a0: 2a 2f 0a 69 6e 74 20 67 65 74 44 62 50 6f 69 6e  */.int getDbPoin
09b0: 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ter(Tcl_Interp *
09c0: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
09d0: 61 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20  ar *zA, sqlite3 
09e0: 2a 2a 70 70 44 62 29 7b 0a 20 20 73 74 72 75 63  **ppDb){.  struc
09f0: 74 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20  t SqliteDb *p;. 
0a00: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
0a10: 49 6e 66 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f  Info;.  if( Tcl_
0a20: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
0a30: 6e 74 65 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49  nterp, zA, &cmdI
0a40: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  nfo) ){.    p = 
0a50: 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62  (struct SqliteDb
0a60: 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  *)cmdInfo.objCli
0a70: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 2a 70 70  entData;.    *pp
0a80: 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65  Db = p->db;.  }e
0a90: 6c 73 65 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d  lse{.    *ppDb =
0aa0: 20 28 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74   (sqlite3*)sqlit
0ab0: 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
0ac0: 7a 41 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  zA);.  }.  retur
0ad0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
0ae0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
0af0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 57 69  *.** Decode a Wi
0b00: 6e 33 32 20 48 41 4e 44 4c 45 20 6f 62 6a 65 63  n32 HANDLE objec
0b10: 74 2e 0a 2a 2f 0a 69 6e 74 20 67 65 74 57 69 6e  t..*/.int getWin
0b20: 33 32 48 61 6e 64 6c 65 28 54 63 6c 5f 49 6e 74  32Handle(Tcl_Int
0b30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e  erp *interp, con
0b40: 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 4c 50 48  st char *zA, LPH
0b50: 41 4e 44 4c 45 20 70 68 46 69 6c 65 29 7b 0a 20  ANDLE phFile){. 
0b60: 20 2a 70 68 46 69 6c 65 20 3d 20 28 48 41 4e 44   *phFile = (HAND
0b70: 4c 45 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  LE)sqlite3TestTe
0b80: 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72  xtToPtr(zA);.  r
0b90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
0ba0: 23 65 6e 64 69 66 0a 0a 65 78 74 65 72 6e 20 63  #endif..extern c
0bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
0bc0: 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a  e3ErrName(int);.
0bd0: 23 64 65 66 69 6e 65 20 74 31 45 72 72 6f 72 4e  #define t1ErrorN
0be0: 61 6d 65 20 73 71 6c 69 74 65 33 45 72 72 4e 61  ame sqlite3ErrNa
0bf0: 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  me../*.** Conver
0c00: 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d  t an sqlite3_stm
0c10: 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74  t* into an sqlit
0c20: 65 33 2a 2e 20 20 54 68 69 73 20 64 65 70 65 6e  e3*.  This depen
0c30: 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63  ds on the.** fac
0c40: 74 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  t that the sqlit
0c50: 65 33 2a 20 69 73 20 74 68 65 20 66 69 72 73 74  e3* is the first
0c60: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 56 64   field in the Vd
0c70: 62 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  be structure..*/
0c80: 0a 23 64 65 66 69 6e 65 20 53 74 6d 74 54 6f 44  .#define StmtToD
0c90: 62 28 58 29 20 20 20 73 71 6c 69 74 65 33 5f 64  b(X)   sqlite3_d
0ca0: 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a  b_handle(X)../*.
0cb0: 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 74 75 72  ** Check a retur
0cc0: 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20  n value to make 
0cd0: 73 75 72 65 20 69 74 20 61 67 72 65 65 73 20 77  sure it agrees w
0ce0: 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ith the results.
0cf0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
0d00: 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  errcode..*/.int 
0d10: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
0d20: 64 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  de(Tcl_Interp *i
0d30: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 20 2a  nterp, sqlite3 *
0d40: 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  db, int rc){.  i
0d50: 66 28 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  f( sqlite3_threa
0d60: 64 73 61 66 65 28 29 3d 3d 30 20 26 26 20 72 63  dsafe()==0 && rc
0d70: 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  !=SQLITE_MISUSE 
0d80: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
0d90: 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 65  .   && sqlite3_e
0da0: 72 72 63 6f 64 65 28 64 62 29 21 3d 72 63 20 29  rrcode(db)!=rc )
0db0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
0dc0: 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32  200];.    int r2
0dd0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
0de0: 64 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  de(db);.    sqli
0df0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
0e00: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
0e10: 0a 20 20 20 20 20 20 20 22 65 72 72 6f 72 20 63  .       "error c
0e20: 6f 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73  ode %s (%d) does
0e30: 20 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74   not match sqlit
0e40: 65 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25  e3_errcode %s (%
0e50: 64 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72  d)",.       t1Er
0e60: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c  rorName(rc), rc,
0e70: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29   t1ErrorName(r2)
0e80: 2c 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52  , r2);.    Tcl_R
0e90: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
0ea0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  p);.    Tcl_Appe
0eb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0ec0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72   zBuf, 0);.    r
0ed0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
0ee0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
0ef0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
0f00: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
0f10: 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  _stmt object..*/
0f20: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53  .static int getS
0f30: 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63  tmtPointer(.  Tc
0f40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0f50: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
0f60: 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74  *zArg,  .  sqlit
0f70: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
0f80: 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
0f90: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73  (sqlite3_stmt*)s
0fa0: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0fb0: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
0fc0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
0fd0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
0fe0: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
0ff0: 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ion of a pointer
1000: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64   that can be und
1010: 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68  erstood.** by th
1020: 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61  e getDbPointer a
1030: 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20  nd getVmPointer 
1040: 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a  routines above..
1050: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65  **.** The proble
1060: 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61  m is, on some ma
1070: 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29  chines (Solaris)
1080: 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69   if you do a pri
1090: 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22  ntf with.** "%p"
10a0: 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e   you cannot turn
10b0: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61   around and do a
10c0: 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20   scanf with the 
10d0: 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a  same "%p" and.**
10e0: 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65   get your pointe
10f0: 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76  r back.  You hav
1100: 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22  e to prepend a "
1110: 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69  0x" before it wi
1120: 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20  ll.** work.  Or 
1130: 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73  at least that is
1140: 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65   what is reporte
1150: 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20  d to me (drh).  
1160: 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61  But this.** beha
1170: 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d  vior varies from
1180: 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68   machine to mach
1190: 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69  ine.  The soluti
11a0: 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a  on used her is.*
11b0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74  * to test the st
11c0: 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72  ring right after
11d0: 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64   it is generated
11e0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
11f0: 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f  n be.** understo
1200: 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64  od by scanf, and
1210: 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65   if not, try pre
1220: 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20  pending an "0x" 
1230: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61  to see if.** tha
1240: 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74  t helps.  If not
1250: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61  hing works, a fa
1260: 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  tal error is gen
1270: 65 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  erated..*/.int s
1280: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1290: 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74  interStr(Tcl_Int
12a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61  erp *interp, cha
12b0: 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70  r *zPtr, void *p
12c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ){.  sqlite3_snp
12d0: 72 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c  rintf(100, zPtr,
12e0: 20 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74   "%p", p);.  ret
12f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1300: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
1310: 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71  k routine for sq
1320: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
1330: 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f()..*/.static i
1340: 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  nt exec_printf_c
1350: 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  b(void *pArg, in
1360: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
1370: 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65  rgv, char **name
1380: 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ){.  Tcl_DString
1390: 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74   *str = (Tcl_DSt
13a0: 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e  ring*)pArg;.  in
13b0: 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f  t i;..  if( Tcl_
13c0: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74  DStringLength(st
13d0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  r)==0 ){.    for
13e0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
13f0: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53  +){.      Tcl_DS
1400: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
1410: 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20  nt(str, name[i] 
1420: 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c  ? name[i] : "NUL
1430: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
1440: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1450: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
1460: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1470: 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69  ment(str, argv[i
1480: 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e  ] ? argv[i] : "N
1490: 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ULL");.  }.  ret
14a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14b0: 54 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  The I/O tracing 
14c0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66  callback..*/.#if
14d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14e0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
14f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1500: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73  NABLE_IOTRACE).s
1510: 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72  tatic FILE *iotr
1520: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74  ace_file = 0;.st
1530: 61 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61  atic void io_tra
1540: 63 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  ce_callback(cons
1550: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1560: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1570: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
1580: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
1590: 76 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  vfprintf(iotrace
15a0: 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  _file, zFormat, 
15b0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
15c0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72  );.  fflush(iotr
15d0: 61 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e  ace_file);.}.#en
15e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
15f0: 3a 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45  :  io_trace FILE
1600: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20  NAME.**.** Turn 
1610: 49 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  I/O tracing on o
1620: 72 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e  r off.  If FILEN
1630: 41 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d  AME is not an em
1640: 70 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49  pty string,.** I
1650: 2f 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e  /O tracing begin
1660: 73 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c  s going into FIL
1670: 45 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41  ENAME. If FILENA
1680: 4d 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a  ME is an empty.*
1690: 2a 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72  * string, I/O tr
16a0: 61 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  acing is turned 
16b0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
16c0: 6e 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  nt test_io_trace
16d0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
16e0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
16f0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1700: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1710: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1720: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1730: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1750: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1760: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1780: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1790: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  ment */.){.#if !
17a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17b0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
17c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
17d0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69  BLE_IOTRACE).  i
17e0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
17f0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1800: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1810: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1820: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1830: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49  ,.          " FI
1840: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
1850: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1860: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ROR;.  }.  if( i
1870: 6f 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20  otrace_file ){. 
1880: 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66     if( iotrace_f
1890: 69 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69  ile!=stdout && i
18a0: 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64  otrace_file!=std
18b0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c  err ){.      fcl
18c0: 6f 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65  ose(iotrace_file
18d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74  );.    }.    iot
18e0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20  race_file = 0;. 
18f0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1900: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
1910: 20 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20   argv[1][0] ){. 
1920: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
1930: 67 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d  gv[1],"stdout")=
1940: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72  =0 ){.      iotr
1950: 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75  ace_file = stdou
1960: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
1970: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c   strcmp(argv[1],
1980: 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
1990: 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69        iotrace_fi
19a0: 6c 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20  le = stderr;.   
19b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f   }else{.      io
19c0: 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70  trace_file = fop
19d0: 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29  en(argv[1], "w")
19e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19f0: 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f  te3IoTrace = io_
1a00: 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a  trace_callback;.
1a10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1a20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 63 6c 61  *.** Usage:  cla
1a40: 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72  ng_sanitize_addr
1a50: 65 73 73 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ess .**.** Retur
1a60: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70  ns true if the p
1a70: 72 6f 67 72 61 6d 20 77 61 73 20 63 6f 6d 70 69  rogram was compi
1a80: 6c 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67 20  led using clang 
1a90: 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 2d 66 73  with the .** -fs
1aa0: 61 6e 69 74 69 7a 65 3d 61 64 64 72 65 73 73 20  anitize=address 
1ab0: 73 77 69 74 63 68 20 6f 6e 20 74 68 65 20 63 6f  switch on the co
1ac0: 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 46 61 6c 73  mmand line. Fals
1ad0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
1ae0: 2a 2a 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  ** Also return t
1af0: 72 75 65 20 69 66 20 74 68 65 20 4f 4d 49 54 5f  rue if the OMIT_
1b00: 4d 49 53 55 53 45 20 65 6e 76 69 72 6f 6e 6d 65  MISUSE environme
1b10: 6e 74 20 76 61 72 69 61 62 6c 65 20 65 78 69 73  nt variable exis
1b20: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
1b30: 74 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65  t clang_sanitize
1b40: 5f 61 64 64 72 65 73 73 28 0a 20 20 76 6f 69 64  _address(.  void
1b50: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1b60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b70: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1b80: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1b90: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ba0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1bb0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1bc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1bd0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
1be0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
1bf0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1c00: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1c10: 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  ){.  int res = 0
1c20: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
1c30: 68 61 73 5f 66 65 61 74 75 72 65 29 0a 23 20 69  has_feature).# i
1c40: 66 20 5f 5f 68 61 73 5f 66 65 61 74 75 72 65 28  f __has_feature(
1c50: 61 64 64 72 65 73 73 5f 73 61 6e 69 74 69 7a 65  address_sanitize
1c60: 72 29 0a 20 20 72 65 73 20 3d 20 31 3b 0a 23 20  r).  res = 1;.# 
1c70: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
1c80: 64 65 66 20 5f 5f 53 41 4e 49 54 49 5a 45 5f 41  def __SANITIZE_A
1c90: 44 44 52 45 53 53 5f 5f 0a 20 20 72 65 73 20 3d  DDRESS__.  res =
1ca0: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
1cb0: 20 72 65 73 3d 3d 30 20 26 26 20 67 65 74 65 6e   res==0 && geten
1cc0: 76 28 22 4f 4d 49 54 5f 4d 49 53 55 53 45 22 29  v("OMIT_MISUSE")
1cd0: 21 3d 30 20 29 20 72 65 73 20 3d 20 31 3b 0a 20  !=0 ) res = 1;. 
1ce0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1cf0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1d00: 77 49 6e 74 4f 62 6a 28 72 65 73 29 29 3b 0a 20  wIntObj(res));. 
1d10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d20: 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  }.  ./*.** Usage
1d30: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
1d40: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
1d50: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
1d60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
1d70: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
1d80: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
1d90: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
1da0: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
1db0: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
1dc0: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
1dd0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
1de0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
1df0: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
1e00: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
1e10: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
1e20: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
1e30: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
1e40: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
1e50: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1e60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e70: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1e80: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1e90: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ea0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1eb0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1ec0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1ed0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
1ee0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
1ef0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1f00: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1f10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1f20: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
1f30: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
1f40: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
1f50: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
1f60: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1f70: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
1f80: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1f90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1fa0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1fb0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1fc0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
1fd0: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
1fe0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ff0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2000: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2010: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
2020: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
2030: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
2040: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2050: 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  str);.  zSql = s
2060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2070: 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29  rgv[2], argv[3])
2080: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2090: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
20a0: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
20b0: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
20c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
20d0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  l);.  sqlite3_sn
20e0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
20f0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
2100: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
2110: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2120: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
2130: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2140: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2150: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2160: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2170: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2180: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2190: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
21a0: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
21b0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
21c0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
21d0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
21e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
21f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2200: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2210: 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20  lite3_exec_hex  
2220: 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e  DB  HEX.**.** In
2230: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
2240: 5f 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72  _exec() on a str
2250: 69 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61  ing that is obta
2260: 69 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74  ined by translat
2270: 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20  ing.** HEX into 
2280: 41 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61  ASCII.  Most cha
2290: 72 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e  racters are tran
22a0: 73 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25  slated as is.  %
22b0: 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20  HH becomes.** a 
22c0: 68 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  hex character..*
22d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
22e0: 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f  t_exec_hex(.  vo
22f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2300: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2310: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2320: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2330: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2340: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2350: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2370: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2380: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2390: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
23a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
23b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23c0: 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  db;.  Tcl_DStrin
23d0: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c  g str;.  int rc,
23e0: 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a   i, j;.  char *z
23f0: 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Err = 0;.  char 
2400: 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53  *zHex;.  char zS
2410: 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72 20  ql[501];.  char 
2420: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20  zBuf[30];.  if( 
2430: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
2440: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2450: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2460: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2470: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2480: 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22         " DB HEX"
2490: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24b0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24c0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
24d0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
24e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
24f0: 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Hex = argv[2];. 
2500: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28 73   for(i=j=0; i<(s
2510: 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20 26  izeof(zSql)-1) &
2520: 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c 20  & zHex[j]; i++, 
2530: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 48  j++){.    if( zH
2540: 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a 48  ex[j]=='%' && zH
2550: 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78 5b  ex[j+2] && zHex[
2560: 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a 53  j+2] ){.      zS
2570: 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65 78  ql[i] = (testHex
2580: 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d 29  ToInt(zHex[j+1])
2590: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
25a0: 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b 0a  Int(zHex[j+2]);.
25b0: 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20        j += 2;.  
25c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
25d0: 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a 5d  Sql[i] = zHex[j]
25e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
25f0: 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63 6c  ql[i] = 0;.  Tcl
2600: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
2610: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
2620: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
2630: 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  , exec_printf_cb
2640: 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a  , &str, &zErr);.
2650: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2660: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
2670: 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29   zBuf, "%d", rc)
2680: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2690: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
26a0: 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
26b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
26c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
26d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
26e0: 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b  e(&str) : zErr);
26f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
2700: 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20  ee(&str);.  if( 
2710: 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66  zErr ) sqlite3_f
2720: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28  ree(zErr);.  if(
2730: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
2740: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
2750: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
2760: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
2770: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2780: 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e 74  * Usage:  db_ent
2790: 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20 20  er DB.**        
27a0: 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a   db_leave DB.**.
27b0: 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61 76  ** Enter or leav
27c0: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 61  e the mutex on a
27d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
27e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27f0: 69 6e 74 20 64 62 5f 65 6e 74 65 72 28 0a 20 20  int db_enter(.  
2800: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
2810: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2820: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2830: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2840: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2850: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2860: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
2870: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2880: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2890: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
28a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
28b0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
28c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
28d0: 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
28e0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
28f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2900: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2910: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2920: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2930: 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20     " DB", 0);.  
2940: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2950: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2960: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2970: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2980: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2990: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ROR;.  sqlite3_m
29a0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
29b0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
29c0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  TCL_OK;.}.static
29d0: 20 69 6e 74 20 64 62 5f 6c 65 61 76 65 28 0a 20   int db_leave(. 
29e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
29f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2a00: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2a10: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2a20: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2a30: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2a40: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2a50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2a70: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2a90: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2aa0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
2ab0: 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
2ac0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2ad0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2ae0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2af0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2b00: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
2b10: 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
2b20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2b30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2b40: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2b50: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
2b60: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2b70: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
2b80: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
2b90: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
2ba0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2bb0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
2bc0: 33 5f 65 78 65 63 20 20 44 42 20 20 53 51 4c 0a  3_exec  DB  SQL.
2bd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
2be0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e   sqlite3_exec in
2bf0: 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68  terface using th
2c00: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
2c10: 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
2c20: 20 74 65 73 74 5f 65 78 65 63 28 0a 20 20 76 6f   test_exec(.  vo
2c30: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2c40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2c50: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2c60: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2c70: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2c80: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2c90: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cb0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2cc0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2cd0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2ce0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2cf0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2d00: 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  db;.  Tcl_DStrin
2d10: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b  g str;.  int rc;
2d20: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
2d30: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  0;.  char *zSql;
2d40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
2d50: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
2d60: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
2d70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2d80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2d90: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2da0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
2db0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
2dc0: 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  SQL", 0);.    re
2dd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2de0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2df0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2e00: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e20: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
2e30: 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c  it(&str);.  zSql
2e40: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e50: 74 66 28 22 25 73 22 2c 20 61 72 67 76 5b 32 5d  tf("%s", argv[2]
2e60: 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
2e70: 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69  zSql[i];){.    i
2e80: 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20  f( zSql[i]=='%' 
2e90: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
2ea0: 2b 5d 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49  +] = (testHexToI
2eb0: 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34  nt(zSql[i+1])<<4
2ec0: 29 20 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74  ) + testHexToInt
2ed0: 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20  (zSql[i+2]);.   
2ee0: 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d     i += 3;.    }
2ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
2f00: 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b  [j++] = zSql[i++
2f10: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2f20: 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63  Sql[j] = 0;.  rc
2f30: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2f40: 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70  db, zSql, exec_p
2f50: 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c 20  rintf_cb, &str, 
2f60: 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  &zErr);.  sqlite
2f70: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2f80: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f90: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
2fa0: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
2fb0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2fc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
2fd0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2fe0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2ff0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
3000: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
3010: 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20  &str) : zErr);. 
3020: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3030: 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45  (&str);.  if( zE
3040: 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  rr ) sqlite3_fre
3050: 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73  e(zErr);.  if( s
3060: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
3070: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
3080: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3090: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
30a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
30b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
30c0: 65 78 65 63 5f 6e 72 20 20 44 42 20 20 53 51 4c  exec_nr  DB  SQL
30d0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
30e0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 69  e sqlite3_exec i
30f0: 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74  nterface using t
3100: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
3110: 20 44 42 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a   DB.  Discard.**
3120: 20 61 6c 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a   all results.*/.
3130: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3140: 65 78 65 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20  exec_nr(.  void 
3150: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
3160: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3170: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3180: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3190: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
31a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
31b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
31c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
31d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
31e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
31f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3200: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3210: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
3220: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
3230: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
3240: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
3250: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3260: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
3270: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
3280: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
3290: 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 53  , .       " DB S
32a0: 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
32b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
32d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
32e0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
32f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3300: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
3310: 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  xec(db, argv[2],
3320: 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20   0, 0, &zErr);. 
3330: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
3340: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
3350: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
3360: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
3370: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3380: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
3390: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
33a0: 74 65 73 74 20 20 53 45 50 41 52 41 54 4f 52 20  test  SEPARATOR 
33b0: 20 41 52 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a   ARG0  ARG1 ....
33c0: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25  **.** Test the %
33d0: 7a 20 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69  z format of sqli
33e0: 74 65 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 55  te_mprintf().  U
33f0: 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69  se multiple mpri
3400: 6e 74 66 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a  ntf() calls to .
3410: 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61  ** concatenate a
3420: 72 67 30 20 74 68 72 6f 75 67 68 20 61 72 67 6e  rg0 through argn
3430: 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 6f 72   using separator
3440: 20 61 73 20 74 68 65 20 73 65 70 61 72 61 74 6f   as the separato
3450: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  r..** Return the
3460: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
3470: 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69  ic int test_mpri
3480: 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e  ntf_z(.  void *N
3490: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
34a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
34b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
34c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
34d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
34e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3500: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3510: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3520: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3530: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3540: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3550: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20    char *zResult 
3560: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
3570: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63   for(i=2; i<argc
3580: 20 26 26 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65   && (i==2 || zRe
3590: 73 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  sult); i++){.   
35a0: 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   zResult = sqlit
35b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73  e3_mprintf("%z%s
35c0: 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72  %s", zResult, ar
35d0: 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b  gv[1], argv[i]);
35e0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
35f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3600: 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73  zResult, 0);.  s
3610: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73  qlite3_free(zRes
3620: 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
3630: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3640: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
3650: 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20  mprintf_n_test  
3660: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73  STRING.**.** Tes
3670: 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61 74 20  t the %n format 
3680: 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74  of sqlite_mprint
3690: 66 28 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65  f().  Return the
36a0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a   length of the.*
36b0: 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a  * input string..
36c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
36d0: 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20  st_mprintf_n(.  
36e0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
36f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3700: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3710: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3720: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3730: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3740: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3750: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3760: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3770: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3780: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3790: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
37a0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
37b0: 53 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  Str;.  int n = 0
37c0: 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74  ;.  zStr = sqlit
37d0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 25 6e  e3_mprintf("%s%n
37e0: 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b  ", argv[1], &n);
37f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3800: 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74  zStr);.  Tcl_Set
3810: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3820: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
3830: 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
3840: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3850: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
3860: 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a  nprintf_int  SIZ
3870: 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a  E FORMAT  INT.**
3880: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f 66 20  .** Test the of 
3890: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
38a0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a  () routine.  SIZ
38b0: 45 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  E is the size of
38c0: 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
38d0: 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 2e 20  uffer in bytes. 
38e0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
38f0: 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52 4d 41  e is 100.  FORMA
3900: 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  T is the.** form
3910: 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e 54 20  at string.  INT 
3920: 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  is a single inte
3930: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  ger argument.  T
3940: 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72  he FORMAT.** str
3950: 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69 72 65  ing must require
3960: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   no more than th
3970: 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72 20 61  is one integer a
3980: 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20  rgument.  If.** 
3990: 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20 66 6f  You pass in a fo
39a0: 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68 61 74  rmat string that
39b0: 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65 20 74   requires more t
39c0: 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  han one argument
39d0: 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67 73 20  ,.** bad things 
39e0: 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a  will happen..*/.
39f0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3a00: 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20  snprintf_int(.  
3a10: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3a20: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3a30: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3a40: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3a50: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3a60: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3a70: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3a80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3a90: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3aa0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3ab0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3ac0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3ad0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53   */.){.  char zS
3ae0: 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e  tr[100];.  int n
3af0: 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31 5d 29   = atoi(argv[1])
3b00: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
3b10: 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76 5b 32  zFormat = argv[2
3b20: 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20 61 74  ];.  int a1 = at
3b30: 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  oi(argv[3]);.  i
3b40: 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72  f( n>sizeof(zStr
3b50: 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a  ) ) n = sizeof(z
3b60: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Str);.  sqlite3_
3b70: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3b80: 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20 22 61 62  zStr), zStr, "ab
3b90: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
3ba0: 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20 73 71  stuvwxyz");.  sq
3bb0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
3bc0: 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c  , zStr, zFormat,
3bd0: 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   a1);.  Tcl_Appe
3be0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3bf0: 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72 65 74   zStr, 0);.  ret
3c00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
3c10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3c20: 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a  IT_GET_TABLE../*
3c30: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3c40: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3c50: 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54  intf  DB  FORMAT
3c60: 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d    STRING  ?--no-
3c70: 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e  counts?.**.** In
3c80: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
3c90: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3ca0: 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 75 73  f() interface us
3cb0: 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ing the open dat
3cc0: 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68  abase.** DB.  Th
3cd0: 65 20 53 51 4c 20 69 73 20 74 68 65 20 73 74 72  e SQL is the str
3ce0: 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65  ing FORMAT.  The
3cf0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73   format string s
3d00: 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
3d10: 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20   one %s or %q.  
3d20: 53 54 52 49 4e 47 20 69 73 20 74 68 65 20 76 61  STRING is the va
3d30: 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  lue inserted int
3d40: 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73  o %s or %q..*/.s
3d50: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
3d60: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28  et_table_printf(
3d70: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3d80: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3d90: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3da0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3db0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3dc0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3dd0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3de0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3df0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3e00: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3e20: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3e30: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
3e40: 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44  te3 *db;.  Tcl_D
3e50: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
3e60: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
3e70: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  rr = 0;.  int nR
3e80: 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20 30  ow = 0, nCol = 0
3e90: 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75  ;.  char **aResu
3ea0: 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  lt;.  int i;.  c
3eb0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
3ec0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
3ed0: 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b  t resCount = -1;
3ee0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29  .  if( argc==5 )
3ef0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
3f00: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
3f10: 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29  v[4], &resCount)
3f20: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3f30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  ROR;.  }.  if( a
3f40: 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d  rgc!=4 && argc!=
3f50: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
3f60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3f70: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
3f80: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
3f90: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
3fa0: 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52   " DB FORMAT STR
3fb0: 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29  ING ?COUNT?", 0)
3fc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3fd0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3fe0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3ff0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
4000: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
4010: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44  L_ERROR;.  Tcl_D
4020: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
4030: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
4040: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
4050: 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  2],argv[3]);.  i
4060: 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20  f( argc==5 ){.  
4070: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
4080: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
4090: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20  l, &aResult, 0, 
40a0: 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c  0, &zErr);.  }el
40b0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
40c0: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64  ite3_get_table(d
40d0: 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c  b, zSql, &aResul
40e0: 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c  t, &nRow, &nCol,
40f0: 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73   &zErr);.    res
4100: 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29  Count = (nRow+1)
4110: 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  *nCol;.  }.  sql
4120: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
4130: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
4140: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
4150: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
4160: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
4170: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
4180: 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Buf);.  if( rc==
4190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
41a0: 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a   if( argc==4 ){.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
41c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
41d0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
41e0: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54 63   nRow);.      Tc
41f0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4200: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4220: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
4230: 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20  f), zBuf, "%d", 
4240: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
4250: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4260: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4270: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4280: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
4290: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
42a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
42b0: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
42c0: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
42d0: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
42e0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
42f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4300: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
4310: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
4320: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
4330: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
4340: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
4350: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
4360: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
4370: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
4380: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
4390: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
43a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
43b0: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
43c0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
43d0: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
43e0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
43f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
4400: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
4410: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
4420: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
4430: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
4440: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
4450: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4460: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4470: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4480: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4490: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
44a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
44b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
44d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
44e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
44f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4500: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4510: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
4520: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4530: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
4540: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4550: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4560: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4570: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4580: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
4590: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
45a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
45b0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
45c0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
45d0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
45e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
45f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
4600: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
4610: 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74  f, "%lld", sqlit
4620: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
4630: 6f 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c  owid(db));.  Tcl
4640: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4650: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
4660: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4670: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4680: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  ge:  sqlite3_key
4690: 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65   DB KEY.**.** Se
46a0: 74 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e  t the codec key.
46b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
46c0: 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20  est_key(.  void 
46d0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
46e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
46f0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4700: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4710: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4720: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4730: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4740: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4750: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
4760: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
4770: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4780: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4790: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
47a0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
47b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
47c0: 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52  TE_OMIT_CODEC_FR
47d0: 4f 4d 5f 54 43 4c 29 0a 20 20 73 71 6c 69 74 65  OM_TCL).  sqlite
47e0: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
47f0: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74  har *zKey;.  int
4800: 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67   nKey;.  if( arg
4810: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
4820: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4830: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4840: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
4850: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
4860: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
4870: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4890: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
48a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
48b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
48c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
48d0: 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Key = argv[2];. 
48e0: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
48f0: 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Key);.  sqlite3_
4900: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
4910: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ey);.#endif.  re
4920: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4930: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4940: 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b  lite3_rekey DB K
4950: 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  EY.**.** Change 
4960: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
4970: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4980: 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20  t_rekey(.  void 
4990: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
49a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
49b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
49c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
49d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
49e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
49f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4a00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4a10: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
4a20: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
4a30: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4a40: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4a50: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
4a60: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
4a70: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
4a80: 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
4a90: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61  nt nKey;.  if( a
4aa0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
4ab0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4ac0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4ad0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4ae0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4af0: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
4b00: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4b10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4b20: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
4b30: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
4b40: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
4b50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4b60: 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b   zKey = argv[2];
4b70: 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e  .  nKey = strlen
4b80: 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  (zKey);.  sqlite
4b90: 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79  3_rekey(db, zKey
4ba0: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
4bb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
4bd0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
4be0: 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20  DB.**.** Closes 
4bf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
4c00: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f  ned by sqlite3_o
4c10: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
4c20: 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  nt sqlite_test_c
4c30: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  lose(.  void *No
4c40: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4c50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4c60: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4c70: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4c80: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4c90: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cb0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4cc0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4cd0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4ce0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4cf0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4d00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4d10: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
4d20: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4d30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4d40: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4d50: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4d60: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4d70: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
4d80: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4d90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4da0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4db0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
4dc0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
4dd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4de0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
4df0: 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  se(db);.  Tcl_Se
4e00: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
4e10: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
4e20: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
4e30: 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
4e40: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
4e50: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4e60: 63 6c 6f 73 65 5f 76 32 20 44 42 0a 2a 2a 0a 2a  close_v2 DB.**.*
4e70: 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74  * Closes the dat
4e80: 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
4e90: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f  sqlite3_open..*/
4ea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4eb0: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32  te_test_close_v2
4ec0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4ed0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4ee0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4ef0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4f00: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4f10: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4f20: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4f40: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4f50: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4f70: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4f80: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
4f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
4fa0: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
4fb0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
4fc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4fd0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4fe0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4ff0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
5000: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
5010: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5020: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
5030: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
5040: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
5050: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
5060: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
5070: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
5080: 32 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  2(db);.  Tcl_Set
5090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
50a0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
50b0: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
50c0: 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
50d0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  L_OK;.}../*.** I
50e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
50f0: 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28   the x_coalesce(
5100: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52  ) function..** R
5110: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
5120: 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c  argument non-NUL
5130: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  L argument..*/.s
5140: 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69 66  tatic void t1_if
5150: 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  nullFunc(.  sqli
5160: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5170: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5180: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5190: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
51a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
51b0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
51c0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
51d0: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
51e0: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29  _type(argv[i]) )
51f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
5200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5210: 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  tes(argv[i]);.  
5220: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5230: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
5240: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
5250: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5260: 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  i]),.          n
5270: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5280: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
5290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
52a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
52b0: 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  est functions.  
52c0: 20 20 68 65 78 38 28 29 20 69 6e 74 65 72 70 72    hex8() interpr
52d0: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
52e0: 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64 20   as.** UTF8 and 
52f0: 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e  returns a hex en
5300: 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c 65  coding.  hex16le
5310: 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74  () interprets it
5320: 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 73  s argument.** as
5330: 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65 74   UTF16le and ret
5340: 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64  urns a hex encod
5350: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5360: 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73 71 6c  oid hex8Func(sql
5370: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c  ite3_context *p,
5380: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5390: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
53a0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
53b0: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  ed char *z;.  in
53c0: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
53d0: 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c  [200];.  z = sql
53e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
53f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
5400: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
5410: 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b 69  uf)/2 - 2 && z[i
5420: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5430: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5440: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 32 2c 20  zeof(zBuf)-i*2, 
5450: 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32  &zBuf[i*2], "%02
5460: 78 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 20  x", z[i]);.  }. 
5470: 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a   zBuf[i*2] = 0;.
5480: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5490: 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29  _text(p, (char*)
54a0: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
54b0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23  _TRANSIENT);.}.#
54c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
54d0: 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
54e0: 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28 73  void hex16Func(s
54f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5500: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5510: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5520: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5530: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a  gned short int *
5540: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5550: 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20  ar zBuf[400];.  
5560: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5570: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
5580: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5590: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d  sizeof(zBuf)/4 -
55a0: 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29   4 && z[i]; i++)
55b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
55c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
55d0: 75 66 29 2d 69 2a 34 2c 20 26 7a 42 75 66 5b 69  uf)-i*4, &zBuf[i
55e0: 2a 34 5d 2c 22 25 30 34 78 22 2c 20 7a 5b 69 5d  *4],"%04x", z[i]
55f0: 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42  &0xff);.  }.  zB
5600: 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20 73  uf[i*4] = 0;.  s
5610: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5620: 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75  xt(p, (char*)zBu
5630: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
5640: 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64  ANSIENT);.}.#end
5650: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  if../*.** A stru
5660: 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63 68  cture into which
5670: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 74   to accumulate t
5680: 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64  ext..*/.struct d
5690: 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c  str {.  int nAll
56a0: 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61 6c  oc;  /* Space al
56b0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
56c0: 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70 61   nUsed;   /* Spa
56d0: 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  ce used */.  cha
56e0: 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65  r *z;     /* The
56f0: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
5700: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
5710: 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61  to a dstr.*/.sta
5720: 74 69 63 20 76 6f 69 64 20 64 73 74 72 41 70 70  tic void dstrApp
5730: 65 6e 64 28 73 74 72 75 63 74 20 64 73 74 72 20  end(struct dstr 
5740: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5750: 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29 7b  z, int divider){
5760: 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
5770: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28  strlen(z);.  if(
5780: 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b 20   p->nUsed + n + 
5790: 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  2 > p->nAlloc ){
57a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  .    char *zNew;
57b0: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d  .    p->nAlloc =
57c0: 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e   p->nAlloc*2 + n
57d0: 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65 77   + 200;.    zNew
57e0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
57f0: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
5800: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  oc);.    if( zNe
5810: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
5820: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29  lite3_free(p->z)
5830: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
5840: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
5850: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
5860: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d      }.    p->z =
5870: 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   zNew;.  }.  if(
5880: 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e   divider && p->n
5890: 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d  Used>0 ){.    p-
58a0: 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  >z[p->nUsed++] =
58b0: 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20   divider;.  }.  
58c0: 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e  memcpy(&p->z[p->
58d0: 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b  nUsed], z, n+1);
58e0: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e  .  p->nUsed += n
58f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5900: 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ed for each call
5910: 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65  back from sqlite
5920: 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61  3ExecFunc.*/.sta
5930: 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63  tic int execFunc
5940: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
5950: 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20  Data, int argc, 
5960: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61  char **argv, cha
5970: 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  r **NotUsed){.  
5980: 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d  struct dstr *p =
5990: 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29 70   (struct dstr*)p
59a0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
59b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
59c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
59d0: 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  argv[i]==0 ){.  
59e0: 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70      dstrAppend(p
59f0: 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a  , "NULL", ' ');.
5a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5a10: 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61   dstrAppend(p, a
5a20: 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20  rgv[i], ' ');.  
5a30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5a40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   0;.}../*.** Imp
5a50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
5a60: 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  he x_sqlite_exec
5a70: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
5a80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  is function take
5a90: 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72  s.** a single ar
5aa0: 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d  gument and attem
5ab0: 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20 74  pts to execute t
5ac0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20  hat argument as 
5ad0: 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69  SQL code..** Thi
5ae0: 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64  s is illegal and
5af0: 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20   should set the 
5b00: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c  SQLITE_MISUSE fl
5b10: 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ag on the databa
5b20: 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  se..**.** 2004-J
5b30: 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20  an-07:  We have 
5b40: 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20  changed this to 
5b50: 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f  make it legal to
5b60: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78   call sqlite3_ex
5b70: 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74  ec().** from wit
5b80: 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  hin a function c
5b90: 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68  all.  .** .** Th
5ba0: 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c  is routine simul
5bb0: 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74 20  ates the effect 
5bc0: 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68  of having two th
5bd0: 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f  reads attempt to
5be0: 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65  .** use the same
5bf0: 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
5c00: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73   same time..*/.s
5c10: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
5c20: 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71  e3ExecFunc(.  sq
5c30: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5c40: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
5c50: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
5c60: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5c70: 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20 78  .  struct dstr x
5c80: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30  ;.  memset(&x, 0
5c90: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
5ca0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
5cb0: 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71 6c  ec((sqlite3*)sql
5cc0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
5cd0: 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20 28  ontext),.      (
5ce0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5cf0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5d00: 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e  ),.      execFun
5d10: 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30  cCallback, &x, 0
5d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
5d30: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5d40: 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20  , x.z, x.nUsed, 
5d50: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5d60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5d70: 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(x.z);.}../*.**
5d80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5d90: 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28 29  of tkt2213func()
5da0: 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74  , a scalar funct
5db0: 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20 65  ion that takes e
5dc0: 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72  xactly.** one ar
5dd0: 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20 74  gument. It has t
5de0: 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  wo interesting f
5df0: 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a  eatures:.**.** *
5e00: 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65   It calls sqlite
5e10: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20 33  3_value_text() 3
5e20: 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61 72   times on the ar
5e30: 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 76  gument sqlite3_v
5e40: 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20 74  alue*..**   If t
5e50: 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65 72  he three pointer
5e60: 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6e  s returned are n
5e70: 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20 53  ot the same an S
5e80: 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69 73  QL error is rais
5e90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65  ed..**.** * Othe
5ea0: 72 77 69 73 65 20 69 74 20 72 65 74 75 72 6e 73  rwise it returns
5eb0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
5ec0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
5ed0: 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20 20 20  on of its .**   
5ee0: 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63 68  argument in such
5ef0: 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56 44   a way as the VD
5f00: 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  BE representatio
5f10: 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c 6c  n is a Mem* cell
5f20: 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65 20   .**   with the 
5f30: 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63 6c  MEM_Term flag cl
5f40: 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b  ear. .**.** Tick
5f50: 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68 65  et #2213 can the
5f60: 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65 64  refore be tested
5f70: 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20 74   by evaluating t
5f80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
5f90: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a  SQL expression:.
5fa0: 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33 66  **.**   tkt2213f
5fb0: 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63 28  unc(tkt2213func(
5fc0: 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a 2f  'a string'));.*/
5fd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b 74  .static void tkt
5fe0: 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20 20  2213Function(.  
5ff0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6000: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
6010: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
6020: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
6030: 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a  ){.  int nText;.
6040: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6050: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a 20  const *zText1;. 
6060: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
6070: 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20 20  onst *zText2;.  
6080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f  unsigned char co
6090: 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20 20  nst *zText3;..  
60a0: 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  nText = sqlite3_
60b0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
60c0: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20 3d  [0]);.  zText1 =
60d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
60e0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
60f0: 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65 33  zText2 = sqlite3
6100: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6110: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20 3d  [0]);.  zText3 =
6120: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6130: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20  ext(argv[0]);.. 
6140: 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54 65   if( zText1!=zTe
6150: 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d 7a  xt2 || zText2!=z
6160: 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71 6c  Text3 ){.    sql
6170: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6180: 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74 32  r(context, "tkt2
6190: 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65 64  213 is not fixed
61a0: 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
61b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  .    char *zCopy
61c0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
61d0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74 29  e3_malloc(nText)
61e0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
61f0: 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65 78  py, zText1, nTex
6200: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
6210: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6220: 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65 78  ext, zCopy, nTex
6230: 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  t, sqlite3_free)
6240: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6250: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
6260: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
6270: 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  4 arguments.  Th
6280: 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74 68  e 2nd and.** 4th
6290: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
62a0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  e one of these s
62b0: 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27 2c  trings:  'text',
62c0: 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f 72   'text16',.** or
62d0: 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70 6f   'blob' correspo
62e0: 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75 6e  nding to API fun
62f0: 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20  ctions.**.**    
6300: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
6310: 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  text().**      s
6320: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6330: 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  t16().**      sq
6340: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
6350: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69  ().**.** The thi
6360: 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  rd argument is a
6370: 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72 20   string, either 
6380: 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74 65  'bytes' or 'byte
6390: 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a  s16' or 'noop',.
63a0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
63b0: 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20   to APIs:.**.** 
63c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
63d0: 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20 20  ue_bytes().**   
63e0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
63f0: 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20 20  _bytes16().**   
6400: 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68     noop.**.** Th
6410: 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74 65  e APIs designate
6420: 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68 72  d by the 2nd thr
6430: 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65 6e  ough 4th argumen
6440: 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a 2a  ts are applied.*
6450: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  * to the first a
6460: 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  rgument in order
6470: 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74 65  .  If the pointe
6480: 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  rs returned by t
6490: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e 64  he.** second and
64a0: 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66 66   fourth are diff
64b0: 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75 74  erent, this rout
64c0: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20  ine returns 1.  
64d0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68  Otherwise,.** th
64e0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
64f0: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ns 0..**.** This
6500: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
6510: 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65 65  d to test to see
6520: 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20 70   when returned p
6530: 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20  ointers from.** 
6540: 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74 65  the _text(), _te
6550: 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f 62  xt16() and _blob
6560: 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20 69  () APIs become i
6570: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
6580: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43 68  tatic void ptrCh
6590: 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  ngFunction(.  sq
65a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
65b0: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
65c0: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
65d0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
65e0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
65f0: 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74 20  1, *p2;.  const 
6600: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 66  char *zCmd;.  if
6610: 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74 75  ( argc!=4 ) retu
6620: 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f  rn;.  zCmd = (co
6630: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6640: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6650: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[1]);.  if( zCm
6660: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6670: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6680: 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"text")==0 ){. 
6690: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
66a0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
66b0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
66c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
66d0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
66e0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
66f0: 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d  Cmd, "text16")==
6700: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
6710: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
6720: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
6730: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
6740: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6750: 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22  cmp(zCmd, "blob"
6760: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d  )==0 ){.    p1 =
6770: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6780: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
6790: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c  (argv[0]);.  }el
67a0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  se{.    return;.
67b0: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f    }.  zCmd = (co
67c0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
67d0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
67e0: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[2]);.  if( zCm
67f0: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6800: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6810: 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  ,"bytes")==0 ){.
6820: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6830: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
6840: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6850: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
6860: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6870: 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29 3d  Cmd, "bytes16")=
6880: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6890: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
68a0: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
68b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
68c0: 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22  cmp(zCmd, "noop"
68d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 64  )==0 ){.    /* d
68e0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
68f0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6900: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
6910: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6920: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6930: 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[3]);.  if( z
6940: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
6950: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
6960: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
6970: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6980: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6990: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
69a0: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
69b0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
69c0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
69d0: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
69e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
69f0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
6a00: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
6a10: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6a20: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6a30: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
6a40: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32  b")==0 ){.    p2
6a50: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6a60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6a70: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
6a80: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6a90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6aa0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6ab0: 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a  xt, p1!=p2);.}..
6ac0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 53 51 4c 20 66  /*.** This SQL f
6ad0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
6ae0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73 77  a different answ
6af0: 65 72 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  er each time it 
6b00: 69 73 20 63 61 6c 6c 65 64 2c 20 65 76 65 6e 20  is called, even 
6b10: 69 66 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  if.** the argume
6b20: 6e 74 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  nts are the same
6b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b40: 20 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69   nondeterministi
6b50: 63 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  cFunction(.  sql
6b60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6b70: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
6b80: 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  gc,  .  sqlite3_
6b90: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6ba0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
6bb0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
6bc0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6bd0: 78 74 2c 20 63 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f  xt, cnt++);.}../
6be0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
6bf0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6c00: 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  tion DB.**.** Ca
6c10: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
6c20: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
6c30: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
6c40: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
6c50: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
6c60: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
6c70: 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54  "x_coalesce".  T
6c80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
6c90: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
6ca0: 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c  .** as the "coal
6cb0: 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20  esce" function. 
6cc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6cd0: 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e  lso registers an
6ce0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
6cf0: 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65   named "x_sqlite
6d00: 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f  _exec" that invo
6d10: 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63  kes sqlite3_exec
6d20: 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71  ().  Invoking sq
6d30: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
6d40: 69 6e 20 74 68 69 73 20 77 61 79 20 69 73 20 69  in this way is i
6d50: 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e  llegal recursion
6d60: 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73   and should rais
6d70: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  e an SQLITE_MISU
6d80: 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65  SE error..** The
6d90: 20 65 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c   effect is simil
6da0: 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20  ar to trying to 
6db0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6dc0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6dd0: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72   from.** two thr
6de0: 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d 65  eads at the same
6df0: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   time..**.** The
6e00: 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61   original motiva
6e10: 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f  tion for this ro
6e20: 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20  utine was to be 
6e30: 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  able to call the
6e40: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  .** sqlite3_crea
6e50: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  te_function func
6e60: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
6e70: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
6e80: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
6e90: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
6ea0: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
6eb0: 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74  n logic..*/.stat
6ec0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
6ed0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
6ee0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6ef0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6f00: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
6f10: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
6f20: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
6f30: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
6f40: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
6f50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6f60: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6f70: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
6f80: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
6f90: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6fa0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
6fb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
6fc0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
6fd0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6fe0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
6ff0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
7000: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
7010: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
7020: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
7030: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7040: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
7050: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
7060: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
7070: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7080: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7090: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
70a0: 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c  b, "x_coalesce",
70b0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
70c0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74 31  , 0, .        t1
70d0: 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20  _ifnullFunc, 0, 
70e0: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
70f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7100: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7110: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7120: 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49 54  "hex8", 1, SQLIT
7130: 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
7140: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20  DETERMINISTIC,. 
7150: 20 20 20 20 20 20 20 20 20 30 2c 20 68 65 78 38           0, hex8
7160: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
7170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7180: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
7190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
71a0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
71b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
71c0: 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20  on(db, "hex16", 
71d0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  1, SQLITE_UTF16 
71e0: 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
71f0: 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20 20  NISTIC,.        
7200: 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63 2c 20    0, hex16Func, 
7210: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
7220: 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  f.  if( rc==SQLI
7230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
7240: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
7250: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
7260: 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c 20  kt2213func", 1, 
7270: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a  SQLITE_ANY, 0, .
7280: 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32 31            tkt221
7290: 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29  3Function, 0, 0)
72a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
72b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
72c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
72d0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
72e0: 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67  , "pointer_chang
72f0: 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e  e", 4, SQLITE_AN
7300: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
7310: 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e   ptrChngFunction
7320: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
7330: 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63 6f 75  /* Functions cou
7340: 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f 75 6e  nter1() and coun
7350: 74 65 72 32 28 29 20 68 61 76 65 20 74 68 65 20  ter2() have the 
7360: 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  same implementat
7370: 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a 2a 20  ion - they.  ** 
7380: 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e 20 61  both return an a
7390: 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67 65 72  scending integer
73a0: 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 2e   with each call.
73b0: 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31 28 29    But counter1()
73c0: 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a 2a 20   is marked.  ** 
73d0: 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  as non-determini
73e0: 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74 65 72  stic and counter
73f0: 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20 61 73  2() is marked as
7400: 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a   deterministic..
7410: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
7420: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7430: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7440: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7450: 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d 31 2c   "counter1", -1,
7460: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
7470: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
7480: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
7490: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
74a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
74b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
74c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
74d0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
74e0: 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51 4c 49  nter2", -1, SQLI
74f0: 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
7500: 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20  ETERMINISTIC,.  
7510: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
7520: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
7530: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
7540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7550: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
7560: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
7570: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
7580: 36 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61  6() API here. Ma
7590: 69 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75  inly for fun, bu
75a0: 74 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63  t also .  ** bec
75b0: 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74  ause it is not t
75c0: 65 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65  ested anywhere e
75d0: 6c 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  lse. */.  if( rc
75e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
75f0: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
7600: 55 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74  Utf16;.    sqlit
7610: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
7620: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
7630: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7640: 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  x);.    pVal = s
7650: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
7660: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
7670: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
7680: 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65   -1, "x_sqlite_e
7690: 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  xec", SQLITE_UTF
76a0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
76b0: 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
76c0: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
76d0: 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
76e0: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
76f0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7700: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
7710: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7740: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
7750: 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20  (db, zUtf16, .  
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
7770: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64   SQLITE_UTF16, d
7780: 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  b, sqlite3ExecFu
7790: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  nc, 0, 0);.    }
77a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
77b0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
77c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
77d0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
77e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
77f0: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
7800: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
7810: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
7820: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
7830: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
7840: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
7850: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
7860: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7870: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
7880: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
7890: 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67  he x_count() agg
78a0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
78b0: 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29  .**.** x_count()
78c0: 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62   counts the numb
78d0: 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61  er of non-null a
78e0: 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74  rguments.  But t
78f0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65  here are.** some
7900: 20 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74   twists for test
7910: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
7920: 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d  .** If the argum
7930: 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29  ent to x_count()
7940: 20 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54   is 40 then a UT
7950: 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70  F-8 error is rep
7960: 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  orted.** on the 
7970: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20  step function.  
7980: 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69  If x_count(41) i
7990: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55  s seen, then a U
79a0: 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69  TF-16 error.** i
79b0: 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68  s reported on th
79c0: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
79d0: 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63    If the total c
79e0: 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e  ount is 42, then
79f0: 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f  .** a UTF-8 erro
7a00: 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e  r is reported on
7a10: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75   the finalize fu
7a20: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
7a30: 65 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e  ef struct t1Coun
7a40: 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b  tCtx t1CountCtx;
7a50: 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43  .struct t1CountC
7a60: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b  tx {.  int n;.};
7a70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43  .static void t1C
7a80: 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69  ountStep(.  sqli
7a90: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7aa0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7ab0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31  e **argv.){.  t1
7ad0: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
7ae0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
7af0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
7b00: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
7b10: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
7b20: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
7b30: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
7b40: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20  type(argv[0]) ) 
7b50: 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  && p ){.    p->n
7b60: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  ++;.  }.  if( ar
7b70: 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  gc>0 ){.    int 
7b80: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
7b90: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
7ba0: 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b      if( v==40 ){
7bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7bc0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7bd0: 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34  ext, "value of 4
7be0: 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f  0 handed to x_co
7bf0: 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64  unt", -1);.#ifnd
7c00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7c10: 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69  TF16.    }else i
7c20: 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20  f( v==41 ){.    
7c30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74    const char zUt
7c40: 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20  f16ErrMsg[] = { 
7c50: 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32  0, 0x61, 0, 0x62
7c60: 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c  , 0, 0x63, 0, 0,
7c70: 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0};.      sqlit
7c80: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31  e3_result_error1
7c90: 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66  6(context, &zUtf
7ca0: 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54  16ErrMsg[1-SQLIT
7cb0: 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31  E_BIGENDIAN], -1
7cc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
7cd0: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
7ce0: 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61  void t1CountFina
7cf0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
7d00: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
7d10: 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b    t1CountCtx *p;
7d20: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
7d30: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7d40: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7d50: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
7d60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d  {.    if( p->n==
7d70: 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  42 ){.      sqli
7d80: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d90: 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75  (context, "x_cou
7da0: 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22  nt totals to 42"
7db0: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , -1);.    }else
7dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7dd0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
7de0: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
7df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
7e00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7e10: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73  MIT_DEPRECATED.s
7e20: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7e30: 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  yCountStep(.  sq
7e40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7e50: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7e60: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7e70: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7e80: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73  /* no-op */.}..s
7e90: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7ea0: 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73  yCountFinalize(s
7eb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7ec0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69  context){.  sqli
7ed0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
7ee0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
7ef0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
7f00: 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e  context));.}.#en
7f10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
7f20: 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  :  sqlite3_creat
7f30: 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a  e_aggregate DB.*
7f40: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
7f50: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7f60: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
7f70: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
7f80: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
7f90: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
7fa0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22   named "x_count"
7fb0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
7fc0: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
7fd0: 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  o the built-in c
7fe0: 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c  ount() function,
7ff0: 20 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63   with a few spec
8000: 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f  ial quirks.** fo
8010: 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71  r testing the sq
8020: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8030: 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a  or() APIs..**.**
8040: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f   The original mo
8050: 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  tivation for thi
8060: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f  s routine was to
8070: 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c   be able to call
8080: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
8090: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
80a0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
80b0: 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72  a query is in pr
80c0: 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a  ogress in order.
80d0: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53  ** to test the S
80e0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74  QLITE_MISUSE det
80f0: 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53  ection logic.  S
8100: 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a  ee misuse.test..
8110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8120: 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74  ne was later ext
8130: 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68  ended to test th
8140: 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33  e use of sqlite3
8150: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a  _result_error().
8160: 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67  ** within aggreg
8170: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
8180: 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69  *.** Later: It i
8190: 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e  s now also exten
81a0: 64 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20  ded to register 
81b0: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
81c0: 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63  nction.** "legac
81d0: 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20  y_count()" with 
81e0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74  the supplied dat
81f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68  abase handle. Th
8200: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
8210: 20 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63   test the deprec
8220: 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67  ated sqlite3_agg
8230: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41  regate_count() A
8240: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  PI..*/.static in
8250: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  t test_create_ag
8260: 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20  gregate(.  void 
8270: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
8280: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8290: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
82a0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
82b0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
82c0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
82d0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
82e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
82f0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8300: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
8310: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
8320: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
8330: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
8340: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
8350: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
8360: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8370: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
8380: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
8390: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
83a0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
83b0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
83c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83d0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
83e0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
83f0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
8400: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8410: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
8420: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8430: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30  db, "x_count", 0
8440: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8450: 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75  , 0,.      t1Cou
8460: 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69  ntStep,t1CountFi
8470: 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  nalize);.  if( r
8480: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8490: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
84a0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
84b0: 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20  (db, "x_count", 
84c0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
84d0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31  0, 0,.        t1
84e0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
84f0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a  tFinalize);.  }.
8500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8510: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
8520: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8530: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
8540: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8550: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61  nction(db, "lega
8560: 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51  cy_count", 0, SQ
8570: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a  LITE_ANY, 0, 0,.
8580: 20 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f          legacyCo
8590: 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43  untStep, legacyC
85a0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20  ountFinalize.   
85b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
85c0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
85d0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
85e0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
85f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
8600: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
8610: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
8620: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
8630: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8640: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
8650: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
8660: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
8670: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
8680: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
8690: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
86a0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
86b0: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
86c0: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
86d0: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
86e0: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
86f0: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
8700: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
8710: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
8720: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
8730: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
8740: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
8750: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
8760: 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28  int test_printf(
8770: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8780: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8790: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
87a0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
87b0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
87c0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
87d0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
87e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
87f0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8800: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
8820: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8830: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ent */.){.  if( 
8840: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
8850: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8860: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8870: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8880: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8890: 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
88a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
88b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
88c0: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
88d0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75  argv[1]);.  retu
88e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
88f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8900: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8910: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
8920: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8930: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
8940: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
8950: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
8960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8970: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8980: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
8990: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
89a0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
89b0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
89c0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
89d0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
89e0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
89f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8a00: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8a10: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8a20: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8a30: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8a40: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
8a50: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
8a60: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8a70: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
8a80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8a90: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8aa0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8ab0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
8ac0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
8ad0: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8af0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
8b00: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
8b10: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
8b20: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
8b30: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
8b40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8b50: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8b60: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8b70: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8b80: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8b90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8ba0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8bb0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8bc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8bd0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8be0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8bf0: 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  t64 FORMAT INTEG
8c00: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
8c10: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
8c20: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
8c30: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
8c40: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
8c50: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
8c60: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20  mprintf_int64(. 
8c70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8c80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8c90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8ca0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8cb0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8cc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8cd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8ce0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8cf0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8d00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8d20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
8d30: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
8d40: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
8d50: 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  a[3];.  char *z;
8d60: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
8d70: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8d80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8d90: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8da0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8db0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
8dc0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
8dd0: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
8de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8df0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
8e00: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
8e10: 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ( sqlite3Atoi64(
8e20: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
8e30: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
8e40: 30 28 61 72 67 76 5b 69 5d 29 2c 20 53 51 4c 49  0(argv[i]), SQLI
8e50: 54 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20  TE_UTF8) ){.    
8e60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8e70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75  lt(interp, "argu
8e80: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61  ment is not a va
8e90: 6c 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67  lid 64-bit integ
8ea0: 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  er", 0);.      r
8eb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d  .    }.  }.  z =
8ed0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8ee0: 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20  (argv[1], a[0], 
8ef0: 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54  a[1], a[2]);.  T
8f00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8f10: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
8f20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
8f30: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
8f40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
8f50: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
8f60: 6e 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20  ntf_long FORMAT 
8f70: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
8f80: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61  INTEGER.**.** Ca
8f90: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
8fa0: 74 68 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67  three long integ
8fb0: 65 72 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20  er arguments.   
8fc0: 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 74 68  This might be th
8fd0: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 73 71 6c  e.** same as sql
8fe0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8ff0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69   or sqlite3_mpri
9000: 6e 74 66 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e  ntf_int64, depen
9010: 64 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66  ding on.** platf
9020: 6f 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  orm..*/.static i
9030: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
9040: 74 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64 20  tf_long(.  void 
9050: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9060: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9070: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9080: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9090: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
90a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
90b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
90c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
90d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
90e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
90f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
9100: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9110: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f 6e  {.  int i;.  lon
9120: 67 20 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69 6e  g int a[3];.  in
9130: 74 20 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a  t b[3];.  char *
9140: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
9150: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9160: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9170: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9180: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
9190: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
91a0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
91b0: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
91c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
91d0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
91e0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
91f0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9200: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9210: 26 62 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &b[i-2]) ) retur
9220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9230: 20 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67 20   a[i-2] = (long 
9240: 69 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20 20  int)b[i-2];.    
9250: 61 5b 69 2d 32 5d 20 26 3d 20 28 28 28 75 36 34  a[i-2] &= (((u64
9260: 29 31 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e 74  )1)<<(sizeof(int
9270: 29 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20 7a  )*8))-1;.  }.  z
9280: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9290: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
92a0: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
92b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
92c0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
92d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
92e0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
92f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9300: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
9310: 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54  rintf_str FORMAT
9320: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9330: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61   STRING.**.** Ca
9340: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9350: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
9360: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74  ments and one st
9370: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  ring argument.*/
9380: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9390: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28  te3_mprintf_str(
93a0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
93b0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
93c0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
93d0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
93e0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
93f0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9400: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9410: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9420: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
9430: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
9440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
9450: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
9460: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
9470: 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20  a[3], i;.  char 
9480: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34  *z;.  if( argc<4
9490: 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20   || argc>5 ){.  
94a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
94b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
94c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
94d0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
94e0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
94f0: 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e  T INT INT ?STRIN
9500: 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  G?\"", 0);.    r
9510: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9520: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
9530: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
9540: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9550: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9560: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
9570: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9580: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
9590: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
95a0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
95b0: 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55  4 ? argv[4] : NU
95c0: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
95d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
95e0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
95f0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9600: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9610: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9620: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
9630: 20 49 4e 54 45 47 45 52 20 46 4f 52 4d 41 54 20   INTEGER FORMAT 
9640: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
9650: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c  STRING.**.** Cal
9660: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
9670: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
9680: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72  ents and one str
9690: 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ing argument.*/.
96a0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
96b0: 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 28  e3_snprintf_str(
96c0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
96d0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
96e0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
96f0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9700: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9710: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9720: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9730: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9740: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
9750: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
9760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
9770: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
9780: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
9790: 61 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e  a[3], i;.  int n
97a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
97b0: 66 28 20 61 72 67 63 3c 35 20 7c 7c 20 61 72 67  f( argc<5 || arg
97c0: 63 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>6 ){.    Tcl_A
97d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
97e0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
97f0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9800: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9810: 20 20 22 20 49 4e 54 20 46 4f 52 4d 41 54 20 49    " INT FORMAT I
9820: 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c  NT INT ?STRING?\
9830: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
9840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9850: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
9860: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
9870: 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e  1], &n) ) return
9880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
9890: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c  ( n<0 ){.    Tcl
98a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
98b0: 74 65 72 70 2c 20 22 4e 20 6d 75 73 74 20 62 65  terp, "N must be
98c0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20   non-negative", 
98d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
98e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
98f0: 66 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b  for(i=3; i<5; i+
9900: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
9910: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9920: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29  rgv[i], &a[i-3])
9930: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9940: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9950: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
9960: 2b 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  +1 );.  sqlite3_
9970: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61  snprintf(n, z, a
9980: 72 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[2], a[0], a[
9990: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
99a0: 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[5] : NULL);.  
99b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
99c0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
99d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
99e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
99f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9a00: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
9a10: 69 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d  intf_double FORM
9a20: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
9a30: 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20  ER DOUBLE.**.** 
9a40: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9a50: 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72  h two integer ar
9a60: 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20  guments and one 
9a70: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a  double argument.
9a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9a90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
9aa0: 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  uble(.  void *No
9ab0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
9ac0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
9ad0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
9ae0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
9af0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9b00: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b20: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9b30: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
9b40: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
9b50: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9b60: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9b70: 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20   int a[3], i;.  
9b80: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72  double r;.  char
9b90: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
9ba0: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
9bb0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9bc0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9bd0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9be0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9bf0: 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e   " FORMAT INT IN
9c00: 54 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b  T DOUBLE\"", 0);
9c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9c20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
9c30: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
9c40: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
9c50: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
9c60: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
9c70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9c80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
9c90: 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70  GetDouble(interp
9ca0: 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 29 20 29  , argv[4], &r) )
9cb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9cc0: 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  R;.  z = sqlite3
9cd0: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
9ce0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29  , a[0], a[1], r)
9cf0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
9d00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
9d10: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
9d20: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
9d30: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
9d40: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
9d50: 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
9d60: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
9d70: 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  UBLE.**.** Call 
9d80: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73  mprintf with a s
9d90: 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67  ingle double arg
9da0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74  ument which is t
9db0: 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68  he product of th
9dc0: 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e  e.** two argumen
9dd0: 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20  ts given above. 
9de0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
9df0: 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c   generate overfl
9e00: 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77  ow and underflow
9e10: 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74  .** doubles to t
9e20: 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72  est that they ar
9e30: 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70  e converted prop
9e40: 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erly..*/.static 
9e50: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
9e60: 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f  ntf_scaled(.  vo
9e70: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9e80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9e90: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9ea0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9eb0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9ec0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9ed0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
9ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9ef0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
9f00: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
9f10: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
9f20: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
9f30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
9f40: 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63  double r[2];.  c
9f50: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
9f60: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
9f70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9f80: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
9f90: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
9fa0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
9fb0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55      " FORMAT DOU
9fc0: 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30  BLE DOUBLE\"", 0
9fd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9fe0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
9ff0: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
a000: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a010: 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  etDouble(interp,
a020: 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32   argv[i], &r[i-2
a030: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
a040: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d  ERROR;.  }.  z =
a050: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a060: 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72  (argv[1], r[0]*r
a070: 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [1]);.  Tcl_Appe
a080: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a090: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
a0a0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
a0b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a0c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
a0d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
a0e0: 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52 49  only FORMAT STRI
a0f0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
a100: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a110: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a120: 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65  ent which is the
a130: 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a   product of the.
a140: 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  ** two arguments
a150: 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54   given above.  T
a160: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  his is used to g
a170: 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77  enerate overflow
a180: 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a   and underflow.*
a190: 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73  * doubles to tes
a1a0: 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  t that they are 
a1b0: 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72  converted proper
a1c0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
a1d0: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
a1e0: 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69  f_stronly(.  voi
a1f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
a200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a210: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a220: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a230: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
a250: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
a260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a270: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
a280: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
a290: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
a2a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
a2b0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
a2c0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
a2d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a2e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
a2f0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
a300: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
a310: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
a320: 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30  MAT STRING\"", 0
a330: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a340: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
a350: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
a360: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67 76  tf(argv[1], argv
a370: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
a380: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a390: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
a3a0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
a3b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a3c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
a3d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
a3e0: 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48 45  double FORMAT HE
a3f0: 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  X.**.** Call mpr
a400: 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67  intf with a sing
a410: 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  le double argume
a420: 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72 69  nt which is deri
a430: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
a440: 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f  hexadecimal enco
a450: 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45 20  ding of an IEEE 
a460: 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  double..*/.stati
a470: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
a480: 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28  rintf_hexdouble(
a490: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
a4a0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
a4b0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
a4c0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
a4d0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
a4e0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
a4f0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
a500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a510: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a520: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
a530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
a540: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
a550: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
a560: 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b   *z;.  double r;
a570: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
a580: 78 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65  x1, x2;.  sqlite
a590: 5f 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28  _uint64 d;.  if(
a5a0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
a5b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a5c0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a5d0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a5e0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a5f0: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a600: 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20  STRING\"", 0);. 
a610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a620: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ROR;.  }.  if( s
a630: 73 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22  scanf(argv[2], "
a640: 25 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20  %08x%08x", &x2, 
a650: 26 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54  &x1)!=2 ){.    T
a660: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a670: 69 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67  interp, "2nd arg
a680: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
a690: 31 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66  16-characters of
a6a0: 20 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72   hex", 0);.    r
a6b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a6c0: 0a 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20  .  }.  d = x2;. 
a6d0: 20 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78   d = (d<<32) + x
a6e0: 31 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20  1;.  memcpy(&r, 
a6f0: 26 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a  &d, sizeof(r));.
a700: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
a710: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72  rintf(argv[1], r
a720: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
a730: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
a740: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
a750: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
a760: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
a770: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
a780: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
a790: 61 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a  ache ?BOOLEAN?.*
a7a0: 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  *.*/.#if !define
a7b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a7c0: 41 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74  ARED_CACHE).stat
a7d0: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62  ic int test_enab
a7e0: 6c 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69  le_shared(.  Cli
a7f0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
a800: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
a810: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
a820: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
a830: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a840: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a850: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a860: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a870: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a880: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
a890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a8a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a8b0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
a8c0: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
a8d0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
a8e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a8f0: 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69   int enable;.  i
a900: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69  nt ret = 0;..  i
a910: 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
a920: 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
a930: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
a940: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
a950: 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20  ?BOOLEAN?");.   
a960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a970: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20 73  R;.  }.  ret = s
a980: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
a990: 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
a9a0: 61 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62  abled;..  if( ob
a9b0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
a9c0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
a9d0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a9e0: 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29  bjv[1], &enable)
a9f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
aa00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
aa10: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
aa20: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
aa30: 5f 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a  _cache(enable);.
aa40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
aa50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
aa60: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
aa70: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
aa80: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
aa90: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
aaa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
aab0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
aac0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
aad0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
aae0: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29  wBooleanObj(ret)
aaf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
ab00: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a  OK;.}.#endif....
ab10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
ab20: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
ab30: 73 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20  sult_codes   DB 
ab40: 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f     BOOLEAN.**.*/
ab50: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
ab60: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
ab70: 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74  _codes(.  Client
ab80: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
ab90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
aba0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
abb0: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
abc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
abd0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
abe0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
abf0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
ac00: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
ac10: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
ac20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ac30: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
ac40: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
ac50: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
ac60: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
ac70: 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a  {.  int enable;.
ac80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
ac90: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
aca0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
acb0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
acc0: 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45   objv, "DB BOOLE
acd0: 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  AN");.    return
ace0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
acf0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
ad00: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ad10: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
ad20: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
ad30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
ad40: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
ad50: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ad60: 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65  objv[2], &enable
ad70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ad80: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
ad90: 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
ada0: 63 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65  codes(db, enable
adb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
adc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
add0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  ge: sqlite3_libv
ade0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a  ersion_number.**
adf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
ae00: 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  est_libversion_n
ae10: 75 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44  umber(.  ClientD
ae20: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
ae30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
ae40: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
ae50: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
ae60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ae70: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ae80: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ae90: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
aea0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
aeb0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
aec0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
aed0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
aee0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
aef0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
af00: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
af10: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
af20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
af30: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
af40: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
af50: 62 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72  ber()));.  retur
af60: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
af70: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
af80: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
af90: 65 74 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d  etadata DB dbnam
afa0: 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d  e tblname colnam
afb0: 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.**.*/.static i
afc0: 6e 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f  nt test_table_co
afd0: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
afe0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
aff0: 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
b000: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
b010: 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
b020: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
b030: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
b040: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
b050: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
b060: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
b070: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
b080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b090: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
b0a0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
b0b0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
b0c0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
b0d0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
b0e0: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
b0f0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e  char *zDb;.  con
b100: 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20  st char *zTbl;. 
b110: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
b120: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  l;.  int rc;.  T
b130: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
b140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
b150: 74 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20  tatype;.  const 
b160: 63 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a  char *zCollseq;.
b170: 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20    int notnull;. 
b180: 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b   int primarykey;
b190: 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65  .  int autoincre
b1a0: 6d 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  ment;..  if( obj
b1b0: 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
b1c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
b1d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
b1e0: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e  1, objv, "DB dbn
b1f0: 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e  ame tblname coln
b200: 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ame");.    retur
b210: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
b220: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
b230: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
b240: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
b250: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
b260: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
b270: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
b280: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
b290: 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Tbl = Tcl_GetStr
b2a0: 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
b2b0: 7a 43 6f 6c 20 3d 20 6f 62 6a 63 3d 3d 35 20 3f  zCol = objc==5 ?
b2c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b2d0: 62 6a 76 5b 34 5d 29 20 3a 20 30 3b 0a 0a 20 20  bjv[4]) : 0;..  
b2e0: 69 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29 3d  if( strlen(zDb)=
b2f0: 3d 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a 20  =0 ) zDb = 0;.. 
b300: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
b310: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
b320: 61 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54 62  ata(db, zDb, zTb
b330: 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20 20  l, zCol, .      
b340: 26 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43 6f  &zDatatype, &zCo
b350: 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c  llseq, &notnull,
b360: 20 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26 61   &primarykey, &a
b370: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a  utoincrement);..
b380: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b390: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
b3a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b3b0: 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
b3c0: 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
b3d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b3e0: 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  ;.  }..  pRet = 
b3f0: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
b400: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b410: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
b420: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b430: 62 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d 31  bj(zDatatype, -1
b440: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
b450: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b460: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
b470: 74 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65  tringObj(zCollse
b480: 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  q, -1));.  Tcl_L
b490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b4a0: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
b4b0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75  _NewIntObj(notnu
b4c0: 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ll));.  Tcl_List
b4d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
b4e0: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
b4f0: 77 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79 6b  wIntObj(primaryk
b500: 65 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ey));.  Tcl_List
b510: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
b520: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
b530: 77 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63 72  wIntObj(autoincr
b540: 65 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 53  ement));.  Tcl_S
b550: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b560: 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65  rp, pRet);..  re
b570: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
b580: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b590: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73 74  MIT_INCRBLOB..st
b5a0: 61 74 69 63 20 69 6e 74 20 62 6c 6f 62 48 61 6e  atic int blobHan
b5b0: 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20 54 63  dleFromObj(.  Tc
b5c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b5d0: 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  , .  Tcl_Obj *pO
b5e0: 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  bj,.  sqlite3_bl
b5f0: 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a 20  ob **ppBlob.){. 
b600: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
b610: 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65  n;..  z = Tcl_Ge
b620: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
b630: 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20  Obj, &n);.  if( 
b640: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 42  n==0 ){.    *ppB
b650: 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  lob = 0;.  }else
b660: 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  {.    int notUse
b670: 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  d;.    Tcl_Chann
b680: 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20  el channel;.    
b690: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
b6a0: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a 20 20  nceData;.    .  
b6b0: 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f    channel = Tcl_
b6c0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
b6d0: 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p, z, &notUsed);
b6e0: 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e 6e 65  .    if( !channe
b6f0: 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  l ) return TCL_E
b700: 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c 5f 46  RROR;..    Tcl_F
b710: 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b 0a 20  lush(channel);. 
b720: 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68 61 6e     Tcl_Seek(chan
b730: 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  nel, 0, SEEK_SET
b740: 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e 63 65  );..    instance
b750: 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43 68  Data = Tcl_GetCh
b760: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
b770: 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20  a(channel);.    
b780: 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c  *ppBlob = *((sql
b790: 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73  ite3_blob **)ins
b7a0: 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20 7d 0a  tanceData);.  }.
b7b0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b7c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
b7d0: 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  test_blob_reopen
b7e0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
b7f0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
b800: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
b810: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
b820: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
b830: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
b840: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
b850: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
b860: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
b870: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
b880: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
b890: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b8a0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
b8b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
b8c0: 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77  Tcl_WideInt iRow
b8d0: 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  id;.  sqlite3_bl
b8e0: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
b8f0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
b900: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
b910: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b920: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
b930: 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29 3b 0a 20  ANNEL ROWID");. 
b940: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b950: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
b960: 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62  blobHandleFromOb
b970: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
b980: 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74  ], &pBlob) ) ret
b990: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b9a0: 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65   if( Tcl_GetWide
b9b0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
b9c0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 52 6f  p, objv[2], &iRo
b9d0: 77 69 64 29 20 29 20 72 65 74 75 72 6e 20 54 43  wid) ) return TC
b9e0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
b9f0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
ba00: 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77  open(pBlob, iRow
ba10: 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  id);.  if( rc!=S
ba20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ba30: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
ba40: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
ba50: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
ba60: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
ba70: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
ba80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
ba90: 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52  TCL_OK : TCL_ERR
baa0: 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a  OR);.}..#endif..
bab0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
bac0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bad0: 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44  ation_v2 DB-HAND
bae0: 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43  LE NAME CMP-PROC
baf0: 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20   DEL-PROC.**.** 
bb00: 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f 63 20    This Tcl proc 
bb10: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
bb20: 69 6e 67 20 74 68 65 20 65 78 70 65 72 69 6d 65  ing the experime
bb30: 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ntal.**   sqlite
bb40: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
bb50: 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66 61 63  on_v2() interfac
bb60: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65 73  e..*/.struct Tes
bb70: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20  tCollationX {.  
bb80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
bb90: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
bba0: 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Cmp;.  Tcl_Obj *
bbb0: 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  pDel;.};.typedef
bbc0: 20 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c   struct TestColl
bbd0: 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61  ationX TestColla
bbe0: 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f  tionX;.static vo
bbf0: 69 64 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  id testCreateCol
bc00: 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a  lationDel(void *
bc10: 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c  pCtx){.  TestCol
bc20: 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65  lationX *p = (Te
bc30: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70  stCollationX *)p
bc40: 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d  Ctx;..  int rc =
bc50: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
bc60: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65  ->interp, p->pDe
bc70: 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  l, TCL_EVAL_DIRE
bc80: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
bc90: 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  AL);.  if( rc!=T
bca0: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  CL_OK ){.    Tcl
bcb0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
bcc0: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
bcd0: 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ..  Tcl_DecrRefC
bce0: 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20  ount(p->pCmp);. 
bcf0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bd00: 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71  t(p->pDel);.  sq
bd10: 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64  lite3_free((void
bd20: 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20   *)p);.}.static 
bd30: 69 6e 74 20 74 65 73 74 43 72 65 61 74 65 43 6f  int testCreateCo
bd40: 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f  llationCmp(.  vo
bd50: 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  id *pCtx,.  int 
bd60: 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76  nLeft,.  const v
bd70: 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e  oid *zLeft,.  in
bd80: 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73  t nRight,.  cons
bd90: 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29  t void *zRight.)
bda0: 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  {.  TestCollatio
bdb0: 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c  nX *p = (TestCol
bdc0: 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a  lationX *)pCtx;.
bdd0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
bde0: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
bdf0: 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a  teObj(p->pCmp);.
be00: 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a    int iRes = 0;.
be10: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
be20: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
be30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
be40: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
be50: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
be60: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c  ngObj((char *)zL
be70: 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20  eft, nLeft));.  
be80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
be90: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
bea0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
beb0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 52  ngObj((char *)zR
bec0: 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a  ight,nRight));..
bed0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
bee0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
bef0: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
bf00: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
bf10: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
bf20: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
bf30: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
bf40: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  (p->interp, Tcl_
bf50: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
bf60: 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73 29 0a  interp), &iRes).
bf70: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
bf80: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
bf90: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54  interp);.  }.  T
bfa0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
bfb0: 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72 65 74  pScript);..  ret
bfc0: 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74  urn iRes;.}.stat
bfd0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
bfe0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
bff0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
c000: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74  ientData, /* Not
c010: 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49   used */.  Tcl_I
c020: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
c030: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
c040: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
c050: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
c060: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
c070: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
c080: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
c090: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
c0a0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
c0b0: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
c0c0: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
c0d0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70  estCollationX *p
c0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
c0f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
c100: 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
c110: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c120: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
c130: 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41  v, "DB-HANDLE NA
c140: 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d  ME CMP-PROC DEL-
c150: 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75  PROC");.    retu
c160: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c170: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
c180: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
c190: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c1a0: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
c1b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
c1c0: 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74   p = (TestCollat
c1d0: 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d  ionX *)sqlite3_m
c1e0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73  alloc(sizeof(Tes
c1f0: 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20  tCollationX));. 
c200: 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b   p->pCmp = objv[
c210: 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20  3];.  p->pDel = 
c220: 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e  objv[4];.  p->in
c230: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
c240: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
c250: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
c260: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c270: 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pDel);..  rc =
c280: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c290: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
c2a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c2b0: 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20  bjv[2]), 16, .  
c2c0: 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74      (void *)p, t
c2d0: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
c2e0: 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74  onCmp, testCreat
c2f0: 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20  eCollationDel.  
c300: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c310: 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20  ITE_MISUSE ){.  
c320: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c330: 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  lt(interp, "sqli
c340: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
c350: 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20 74  te_v2() failed t
c360: 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20 20  o detect ".     
c370: 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63   "an invalid enc
c380: 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30  oding", (char*)0
c390: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c3a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
c3b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
c3c0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
c3d0: 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  db, Tcl_GetStrin
c3e0: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49  g(objv[2]), SQLI
c3f0: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
c400: 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43  (void *)p, testC
c410: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
c420: 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  p, testCreateCol
c430: 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20  lationDel.  );. 
c440: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
c450: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20  }../*.** USAGE: 
c460: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c470: 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41  unction_v2 DB NA
c480: 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57 49  ME NARG ENC ?SWI
c490: 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61  TCHES?.**.** Ava
c4a0: 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73 20  ilable switches 
c4b0: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75  are:.**.**   -fu
c4c0: 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a 20  nc    SCRIPT.** 
c4d0: 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49 50    -step    SCRIP
c4e0: 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20  T.**   -final   
c4f0: 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73  SCRIPT.**   -des
c500: 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74  troy SCRIPT.*/.t
c510: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 72  ypedef struct Cr
c520: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 43  eateFunctionV2 C
c530: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b  reateFunctionV2;
c540: 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46 75  .struct CreateFu
c550: 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c  nctionV2 {.  Tcl
c560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
c570: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e  .  Tcl_Obj *pFun
c580: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c590: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c5a0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61   function invoca
c5b0: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  tion */.  Tcl_Ob
c5c0: 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20 20  j *pStep;       
c5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72            /* Scr
c5e0: 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74 65  ipt for agg. ste
c5f0: 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a  p invocation */.
c600: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61    Tcl_Obj *pFina
c610: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c620: 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20    /* Script for 
c630: 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f  agg. finalizatio
c640: 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a  n invocation */.
c650: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74    Tcl_Obj *pDest
c660: 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  roy;            
c670: 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20    /* Destructor 
c680: 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61  script */.};.sta
c690: 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e 63  tic void cf2Func
c6a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c6b0: 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c   *ctx, int nArg,
c6c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c6d0: 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63  *aArg){.}.static
c6e0: 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73 71   void cf2Step(sq
c6f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
c700: 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
c710: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41  lite3_value **aA
c720: 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  rg){.}.static vo
c730: 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c 69  id cf2Final(sqli
c740: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
c750: 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  ){.}.static void
c760: 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69 64   cf2Destroy(void
c770: 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65 61   *pUser){.  Crea
c780: 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20  teFunctionV2 *p 
c790: 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f  = (CreateFunctio
c7a0: 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20  nV2 *)pUser;..  
c7b0: 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26 26  if( p->interp &&
c7c0: 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a   p->pDestroy ){.
c7d0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c      int rc = Tcl
c7e0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
c7f0: 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f  terp, p->pDestro
c800: 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
c810: 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f  c!=TCL_OK ) Tcl_
c820: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c830: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c840: 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20  .  if( p->pFunc 
c850: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
c860: 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  nt(p->pFunc); . 
c870: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
c880: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c890: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
c8a0: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54  f( p->pFinal ) T
c8b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c8c0: 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69  p->pFinal); .  i
c8d0: 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  f( p->pDestroy )
c8e0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c8f0: 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20  t(p->pDestroy); 
c900: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c910: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
c920: 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e   test_create_fun
c930: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65  ction_v2(.  Clie
c940: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c950: 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  a,          /* N
c960: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
c970: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c990: 54 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c  The invoking TCL
c9a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
c9b0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c9e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
c9f0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
ca00: 76 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v[]           /*
ca10: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
ca20: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
ca30: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
ca40: 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69  char *zFunc;.  i
ca50: 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65  nt nArg;.  int e
ca60: 6e 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63  nc;.  CreateFunc
ca70: 74 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74  tionV2 *p;.  int
ca80: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
ca90: 20 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65   struct EncTable
caa0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
cab0: 72 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74  r *zEnc;.    int
cac0: 20 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d   enc;.  } aEnc[]
cad0: 20 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22   = {.    {"utf8"
cae0: 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38  ,    SQLITE_UTF8
caf0: 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22   },.    {"utf16"
cb00: 2c 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ,   SQLITE_UTF16
cb10: 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c   },.    {"utf16l
cb20: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
cb30: 4c 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31  LE },.    {"utf1
cb40: 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6be", SQLITE_UTF
cb50: 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e  16BE },.    {"an
cb60: 79 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41  y",     SQLITE_A
cb70: 4e 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20  NY },.    {"0", 
cb80: 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20  0 }.  };..  if( 
cb90: 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25  objc<5 || (objc%
cba0: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  2)==0 ){.    Tcl
cbb0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
cbc0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
cbd0: 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43  DB NAME NARG ENC
cbe0: 20 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a   SWITCHES...");.
cbf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cc00: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
cc10: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
cc20: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
cc30: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
cc40: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
cc50: 45 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d  ERROR;.  zFunc =
cc60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
cc70: 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
cc80: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
cc90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
cca0: 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72  , &nArg) ) retur
ccb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ccc0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
ccd0: 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74  romObjStruct(int
cce0: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45  erp, objv[4], aE
ccf0: 6e 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b  nc, sizeof(aEnc[
cd00: 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  0]), .          
cd10: 22 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26  "encoding", 0, &
cd20: 65 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  enc).  ){.    re
cd30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cd40: 20 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63    }.  enc = aEnc
cd50: 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20  [enc].enc;..  p 
cd60: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
cd70: 28 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75  (sizeof(CreateFu
cd80: 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73  nctionV2));.  as
cd90: 73 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d  sert( p );.  mem
cda0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
cdb0: 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56  (CreateFunctionV
cdc0: 32 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70  2));.  p->interp
cdd0: 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f   = interp;..  fo
cde0: 72 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69  r(i=5; i<objc; i
cdf0: 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  +=2){.    int iS
ce00: 77 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74  witch;.    const
ce10: 20 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b   char *azSwitch[
ce20: 5d 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d  ] = {"-func", "-
ce30: 73 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c  step", "-final",
ce40: 20 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b   "-destroy", 0};
ce50: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
ce60: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
ce70: 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a  erp, objv[i], az
ce80: 53 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22  Switch, "switch"
ce90: 2c 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29  , 0, &iSwitch) )
cea0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ceb0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72  free(p);.      r
cec0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ced0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
cee0: 63 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20  ch( iSwitch ){. 
cef0: 20 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e       case 0: p->
cf00: 70 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31  pFunc = objv[i+1
cf10: 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ];      break;. 
cf20: 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e       case 1: p->
cf30: 70 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31  pStep = objv[i+1
cf40: 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ];      break;. 
cf50: 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e       case 2: p->
cf60: 70 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b  pFinal = objv[i+
cf70: 31 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  1];     break;. 
cf80: 20 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e       case 3: p->
cf90: 70 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b  pDestroy = objv[
cfa0: 69 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20  i+1];   break;. 
cfb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
cfc0: 2d 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75  ->pFunc ) p->pFu
cfd0: 6e 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  nc = Tcl_Duplica
cfe0: 74 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b  teObj(p->pFunc);
cff0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70   .  if( p->pStep
d000: 20 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63   ) p->pStep = Tc
d010: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
d020: 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28  ->pStep); .  if(
d030: 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e   p->pFinal ) p->
d040: 70 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70  pFinal = Tcl_Dup
d050: 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69  licateObj(p->pFi
d060: 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  nal); .  if( p->
d070: 70 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44  pDestroy ) p->pD
d080: 65 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70  estroy = Tcl_Dup
d090: 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65  licateObj(p->pDe
d0a0: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20  stroy); ..  if( 
d0b0: 70 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49  p->pFunc ) Tcl_I
d0c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
d0d0: 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d  Func); .  if( p-
d0e0: 3e 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63  >pStep ) Tcl_Inc
d0f0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74  rRefCount(p->pSt
d100: 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  ep); .  if( p->p
d110: 46 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72  Final ) Tcl_Incr
d120: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e  RefCount(p->pFin
d130: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d140: 44 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e  Destroy ) Tcl_In
d150: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44  crRefCount(p->pD
d160: 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20  estroy); ..  rc 
d170: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
d180: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c  _function_v2(db,
d190: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
d1a0: 63 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20  c, (void *)p, . 
d1b0: 20 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f       (p->pFunc ?
d1c0: 20 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20   cf2Func : 0),. 
d1d0: 20 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f       (p->pStep ?
d1e0: 20 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20   cf2Step : 0),. 
d1f0: 20 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20       (p->pFinal 
d200: 3f 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c  ? cf2Final : 0),
d210: 0a 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f  .      cf2Destro
d220: 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  y.  );.  if( rc!
d230: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d240: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
d250: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
d260: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d270: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
d280: 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
d290: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d2a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
d2b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
d2c0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
d2d0: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
d2e0: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45  n DB-HANDLE FILE
d2f0: 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69   ?PROC?.*/.stati
d300: 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f  c int test_load_
d310: 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69  extension(.  Cli
d320: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
d330: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
d340: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
d350: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
d360: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
d370: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
d380: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
d390: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
d3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d3b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
d3c0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
d3d0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
d3e0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
d3f0: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64   */.){.  Tcl_Cmd
d400: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
d410: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
d420: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
d430: 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  Db;.  char *zFil
d440: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 63  e;.  char *zProc
d450: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
d460: 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  rr = 0;..  if( o
d470: 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d  bjc!=4 && objc!=
d480: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
d490: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d4a0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48  , 1, objv, "DB-H
d4b0: 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43  ANDLE FILE ?PROC
d4c0: 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
d4d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d4e0: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
d4f0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
d500: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
d510: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
d520: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  .  if( objc==4 )
d530: 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 54 63  {.    zProc = Tc
d540: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d550: 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  [3]);.  }..  /* 
d560: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
d570: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
d580: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
d590: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
d5a0: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
d5b0: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
d5c0: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
d5d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d5e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
d5f0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
d600: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
d610: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d620: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
d630: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
d640: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
d650: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
d660: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
d670: 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20  ..  /* Call the 
d680: 75 6e 64 65 72 6c 79 69 6e 67 20 43 20 66 75 6e  underlying C fun
d690: 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72  ction. If an err
d6a0: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72  or occurs, set r
d6b0: 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45  c to .  ** TCL_E
d6c0: 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e  RROR and load an
d6d0: 79 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20 69  y error string i
d6e0: 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65  nto the interpre
d6f0: 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a  ter. If no .  **
d700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
d710: 65 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e  et rc to TCL_OK.
d720: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
d730: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
d740: 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53  TENSION.  rc = S
d750: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a  QLITE_ERROR;.  z
d760: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
d770: 72 69 6e 74 66 28 22 74 68 69 73 20 62 75 69 6c  rintf("this buil
d780: 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f  d omits sqlite3_
d790: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
d7a0: 22 29 3b 0a 20 20 28 76 6f 69 64 29 7a 50 72 6f  ");.  (void)zPro
d7b0: 63 3b 0a 20 20 28 76 6f 69 64 29 7a 46 69 6c 65  c;.  (void)zFile
d7c0: 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73  ;.#else.  rc = s
d7d0: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
d7e0: 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c  nsion(db, zFile,
d7f0: 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a   zProc, &zErr);.
d800: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
d810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d820: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
d830: 69 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a  interp, zErr ? z
d840: 45 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f  Err : "", TCL_VO
d850: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20  LATILE);.    rc 
d860: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  = TCL_ERROR;.  }
d870: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54  else{.    rc = T
d880: 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  CL_OK;.  }.  sql
d890: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
d8a0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
d8b0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
d8c0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
d8d0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d  ad_extension DB-
d8e0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a  HANDLE ONOFF.*/.
d8f0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d900: 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43  enable_load(.  C
d910: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
d920: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
d930: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
d940: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
d950: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
d960: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
d970: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
d980: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d9a0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d9b0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
d9c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
d9d0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
d9e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
d9f0: 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
da00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
da10: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e   char *zDb;.  in
da20: 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20  t onoff;..  if( 
da30: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
da40: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
da50: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
da60: 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46   "DB-HANDLE ONOF
da70: 46 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  F");.    return 
da80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
da90: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
daa0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a  ring(objv[1]);..
dab0: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
dac0: 20 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   C database hand
dad0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20  le from the Tcl 
dae0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a  command name */.
daf0: 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
db00: 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
db10: 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29  , zDb, &cmdInfo)
db20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
db30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
db40: 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
db50: 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68  und: ", zDb, (ch
db60: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
db70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
db80: 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63  }.  db = ((struc
db90: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
dba0: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
dbb0: 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  a)->db;.  assert
dbc0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
dbd0: 74 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65  the onoff parame
dbe0: 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c  ter */.  if( Tcl
dbf0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
dc00: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
dc10: 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
dc20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
dc30: 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ROR;.  }..#ifdef
dc40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
dc50: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63  D_EXTENSION.  Tc
dc60: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
dc70: 6e 74 65 72 70 2c 20 22 74 68 69 73 20 62 75 69  nterp, "this bui
dc80: 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33  ld omits sqlite3
dc90: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
dca0: 29 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )");.  return TC
dcb0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
dcc0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
dcd0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
dce0: 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74  b, onoff);.  ret
dcf0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64  urn TCL_OK;.#end
dd00: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  if.}../*.** Usag
dd10: 65 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  e:  sqlite_abort
dd20: 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  .**.** Shutdown 
dd30: 74 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65  the process imme
dd40: 64 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69  diately.  This i
dd50: 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68  s not a clean sh
dd60: 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20  utdown..** This 
dd70: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
dd80: 74 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f  to test the reco
dd90: 76 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20  verability of a 
dda0: 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74  database in.** t
ddb0: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72  he event of a pr
ddc0: 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a  ogram crash..*/.
ddd0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
dde0: 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20  e_abort(.  void 
ddf0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
de00: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
de10: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
de20: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
de30: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
de40: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
de50: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
de60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
de70: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
de80: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
de90: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
dea0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
deb0: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d  {.#if defined(_M
dec0: 53 43 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20  SC_VER).  /* We 
ded0: 64 6f 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69  do this, otherwi
dee0: 73 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c  se the test will
def0: 20 68 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70   halt with a pop
df00: 75 70 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20  up message.   * 
df10: 74 68 61 74 20 77 65 20 68 61 76 65 20 74 6f 20  that we have to 
df20: 63 6c 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72  click away befor
df30: 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20  e the test will 
df40: 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a  continue..   */.
df50: 20 20 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68    _set_abort_beh
df60: 61 76 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f  avior( 0, _CALL_
df70: 52 45 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23  REPORTFAULT );.#
df80: 65 6e 64 69 66 0a 20 20 65 78 69 74 28 32 35 35  endif.  exit(255
df90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74  );.  assert( int
dfa0: 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54  erp==0 );   /* T
dfb0: 68 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  his will always 
dfc0: 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  fail */.  return
dfd0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
dfe0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
dff0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65  routine is a use
e000: 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75  r-defined SQL fu
e010: 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72  nction whose pur
e020: 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65  pose.** is to te
e030: 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  st the sqlite_se
e040: 74 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a  t_result() API..
e050: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
e060: 65 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  estFunc(sqlite3_
e070: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
e080: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
e090: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
e0a0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63  ){.  while( argc
e0b0: 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=2 ){.    const
e0c0: 20 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28   char *zArg0 = (
e0d0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
e0e0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
e0f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30  );.    if( zArg0
e100: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   ){.      if( 0=
e110: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
e120: 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b  zArg0, "int") ){
e130: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e140: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
e150: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
e160: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29  ue_int(argv[1]))
e170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e180: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e190: 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d  (zArg0,"int64")=
e1a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
e1b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
e1c0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  64(context, sqli
e1d0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
e1e0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e1f0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e200: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e210: 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a  "string")==0 ){.
e220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e230: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
e240: 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ext, (char*)sqli
e250: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
e260: 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20  rgv[1]), -1,.   
e270: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
e280: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
e290: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
e2a0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
e2b0: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
e2c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e2d0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
e2e0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
e2f0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
e300: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
e310: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
e320: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75  trICmp(zArg0,"nu
e330: 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
e340: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
e350: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
e360: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e370: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e380: 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d  zArg0,"value")==
e390: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
e3a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
e3b0: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
e3c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
e3d0: 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20  t(argv[1])]);.  
e3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e3f0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
e400: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
e410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f  else{.      goto
e420: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e430: 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b  }.    argc -= 2;
e440: 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a  .    argv += 2;.
e450: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65    }.  return;..e
e460: 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
e470: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
e480: 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20  (context,"first 
e490: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
e4a0: 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20  be one of: ".   
e4b0: 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74     "int int64 st
e4c0: 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c  ring double null
e4d0: 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a   value", -1);.}.
e4e0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
e4f0: 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f  sqlite_register_
e500: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44  test_function  D
e510: 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  B  NAME.**.** Re
e520: 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20  gister the test 
e530: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  SQL function on 
e540: 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20  the database DB 
e550: 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e  under the name N
e560: 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  AME..*/.static i
e570: 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72  nt test_register
e580: 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _func(.  void *N
e590: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
e5a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
e5b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
e5c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
e5d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
e5e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e600: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
e610: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
e620: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
e630: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
e640: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
e650: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
e660: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
e670: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
e680: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e690: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
e6a0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
e6b0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
e6c0: 20 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54        " DB FUNCT
e6d0: 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20  ION-NAME", 0);. 
e6e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e6f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
e700: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
e710: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
e720: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
e730: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
e740: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e750: 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
e760: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
e770: 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73  8, 0, .      tes
e780: 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  tFunc, 0, 0);.  
e790: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
e7a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e7b0: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
e7c0: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
e7d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e7e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
e7f0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
e800: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
e810: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
e820: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
e830: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
e840: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
e850: 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54  3_finalize  STMT
e860: 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65   .**.** Finalize
e870: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
e880: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
e890: 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65  nt test_finalize
e8a0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
e8b0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
e8c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
e8d0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
e8e0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
e8f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
e900: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
e910: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
e920: 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  db = 0;..  if( o
e930: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
e940: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e950: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
e960: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
e970: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
e980: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e990: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
e9a0: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
e9b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e9c0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
e9d0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
e9e0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
e9f0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
ea00: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
ea10: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
ea20: 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62   pStmt ){.    db
ea30: 20 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d   = StmtToDb(pStm
ea40: 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
ea50: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
ea60: 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
ea70: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
ea80: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
ea90: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
eaa0: 54 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26  TIC);.  if( db &
eab0: 26 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  & sqlite3TestErr
eac0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
ead0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
eae0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
eaf0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
eb00: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
eb10: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20  e3_stmt_status  
eb20: 53 54 4d 54 20 20 43 4f 44 45 20 20 52 45 53 45  STMT  CODE  RESE
eb30: 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20  TFLAG.**.** Get 
eb40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
eb50: 74 61 74 75 73 20 63 6f 75 6e 74 65 72 20 66 72  tatus counter fr
eb60: 6f 6d 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  om a statement..
eb70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
eb80: 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a  st_stmt_status(.
eb90: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
eba0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
ebb0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
ebc0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
ebd0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
ebe0: 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a  {.  int iValue;.
ebf0: 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d 20 30 2c    int i, op = 0,
ec00: 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63 6f   resetFlag;.  co
ec10: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
ec20: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  e;.  sqlite3_stm
ec30: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74 61  t *pStmt;..  sta
ec40: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
ec50: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
ec60: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
ec70: 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d 20  t op;.  } aOp[] 
ec80: 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
ec90: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
eca0: 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20 53  LSCAN_STEP",   S
ecb0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
ecc0: 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 20  _FULLSCAN_STEP  
ecd0: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
ece0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
ecf0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  T",            S
ed00: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
ed10: 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20 20  _SORT           
ed20: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
ed30: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
ed40: 4f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 53  OINDEX",       S
ed50: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
ed60: 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20 20  _AUTOINDEX      
ed70: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
ed80: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f  E_STMTSTATUS_VM_
ed90: 53 54 45 50 22 2c 20 20 20 20 20 20 20 20 20 53  STEP",         S
eda0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
edb0: 5f 56 4d 5f 53 54 45 50 20 20 20 20 20 20 20 20  _VM_STEP        
edc0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20 6f   },.  };.  if( o
edd0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
ede0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
edf0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
ee00: 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52 20  "STMT PARAMETER 
ee10: 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20 20  RESETFLAG");.   
ee20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ee30: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
ee40: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
ee50: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
ee60: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
ee70: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
ee80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61 6d  _ERROR;.  zOpNam
ee90: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
eea0: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f  g(objv[2]);.  fo
eeb0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
eec0: 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  ze(aOp); i++){. 
eed0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 4f     if( strcmp(aO
eee0: 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70 4e  p[i].zName, zOpN
eef0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
ef00: 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70 3b   op = aOp[i].op;
ef10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ef20: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
ef30: 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 20  =ArraySize(aOp) 
ef40: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
ef50: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
ef60: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
ef70: 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  p) ) return TCL_
ef80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
ef90: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
efa0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
efb0: 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46 6c  bjv[3], &resetFl
efc0: 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ag) ) return TCL
efd0: 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75 65  _ERROR;.  iValue
efe0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
eff0: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f 70  status(pStmt, op
f000: 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 20  , resetFlag);.  
f010: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
f020: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
f030: 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29 3b  IntObj(iValue));
f040: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f050: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
f060: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
f070: 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a 2a 2a 20  CANSTATUS./*.** 
f080: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
f090: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 20  stmt_scanstatus 
f0a0: 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73 74 61 74  STMT IDX.*/.stat
f0b0: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
f0c0: 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20 76  _scanstatus(.  v
f0d0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
f0e0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
f0f0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
f100: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
f110: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
f120: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
f130: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
f140: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
f150: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b  nt */.  int idx;
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
f180: 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a 20  d argument */.. 
f190: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
f1a0: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
f1b0: 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73 71   *zExplain;.  sq
f1c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f  lite3_int64 nLoo
f1d0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  p;.  sqlite3_int
f1e0: 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f 75  64 nVisit;.  dou
f1f0: 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74 20  ble rEst;.  int 
f200: 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  res;..  if( objc
f210: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
f220: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f230: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
f240: 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72 65  MT IDX");.    re
f250: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f260: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
f270: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
f280: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f290: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
f2a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f2b0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
f2c0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
f2d0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
f2e0: 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
f2f0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20 3d  _ERROR;..  res =
f300: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
f310: 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20  anstatus(pStmt, 
f320: 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  idx, SQLITE_SCAN
f330: 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69  STAT_NLOOP, (voi
f340: 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69 66  d*)&nLoop);.  if
f350: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
f360: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
f370: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
f380: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f390: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f3a0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f3b0: 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d 31  gObj("nLoop", -1
f3c0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f3d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f3e0: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f3f0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f 6f  wWideIntObj(nLoo
f400: 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p));.    sqlite3
f410: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
f420: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c  (pStmt, idx, SQL
f430: 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49  ITE_SCANSTAT_NVI
f440: 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69  SIT, (void*)&nVi
f450: 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  sit);.    Tcl_Li
f460: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f470: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f480: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 56  NewStringObj("nV
f490: 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20  isit", -1));.   
f4a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f4b0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
f4c0: 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  t, Tcl_NewWideIn
f4d0: 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a 20  tObj(nVisit));. 
f4e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
f4f0: 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74  scanstatus(pStmt
f500: 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43  , idx, SQLITE_SC
f510: 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69  ANSTAT_EST, (voi
f520: 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 54  d*)&rEst);.    T
f530: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f540: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f550: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f560: 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b 0a  j("nEst", -1));.
f570: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f580: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
f590: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f 75  pRet, Tcl_NewDou
f5a0: 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a 20  bleObj(rEst));. 
f5b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
f5c0: 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74  scanstatus(pStmt
f5d0: 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43  , idx, SQLITE_SC
f5e0: 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76 6f  ANSTAT_NAME, (vo
f5f0: 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20 20  id*)&zName);.   
f600: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f610: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
f620: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
f630: 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31 29  Obj("zName", -1)
f640: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
f650: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f660: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
f670: 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c  StringObj(zName,
f680: 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69 74   -1));.    sqlit
f690: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f6a0: 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53  us(pStmt, idx, S
f6b0: 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45  QLITE_SCANSTAT_E
f6c0: 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26  XPLAIN, (void*)&
f6d0: 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 54  zExplain);.    T
f6e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f6f0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f700: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f710: 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d 31  j("zExplain", -1
f720: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f730: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f740: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f750: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70 6c  wStringObj(zExpl
f760: 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ain, -1));.    T
f770: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
f780: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
f790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
f7a0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
f7b0: 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rp);.  }.  retur
f7c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
f7d0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f7e0: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f7f0: 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a 2a  us_reset  STMT.*
f800: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
f810: 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  t_stmt_scanstatu
f820: 73 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20  s_reset(.  void 
f830: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
f840: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
f850: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
f860: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
f870: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
f880: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
f890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f8a0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a  First argument *
f8b0: 2f 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  /.  if( objc!=2 
f8c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
f8d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f8e0: 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
f8f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f900: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
f910: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
f920: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
f930: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
f940: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
f950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
f960: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
f970: 73 74 61 74 75 73 5f 72 65 73 65 74 28 70 53 74  status_reset(pSt
f980: 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  mt);.  return TC
f990: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
f9a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f9b0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a  ABLE_SQLLOG./*.*
f9c0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
f9d0: 33 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a  3_config_sqllog.
f9e0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 53  **.** Zero the S
f9f0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
fa00: 4c 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  LOG configuratio
fa10: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
fa20: 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c  test_config_sqll
fa30: 6f 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  og(.  void * cli
fa40: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
fa50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
fa60: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
fa70: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
fa80: 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  [].){.  if( objc
fa90: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
faa0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fab0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
fac0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
fad0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
fae0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
faf0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
fb00: 47 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  G, 0, 0);.  retu
fb10: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
fb20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
fb30: 3a 20 76 66 73 5f 63 75 72 72 65 6e 74 5f 74 69  : vfs_current_ti
fb40: 6d 65 5f 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52  me_int64.**.** R
fb50: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
fb60: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
fb70: 64 65 66 61 75 6c 74 20 56 46 53 27 73 20 78 43  default VFS's xC
fb80: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
fb90: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
fba0: 63 20 69 6e 74 20 76 66 73 43 75 72 72 65 6e 74  c int vfsCurrent
fbb0: 54 69 6d 65 49 6e 74 36 34 28 0a 20 20 76 6f 69  TimeInt64(.  voi
fbc0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
fbd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
fbe0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
fbf0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
fc00: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
fc10: 36 34 20 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  64 t;.  sqlite3_
fc20: 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69  vfs *pVfs = sqli
fc30: 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
fc40: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
fc50: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
fc60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fc70: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
fc80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fc90: 52 3b 0a 20 20 7d 0a 20 20 70 56 66 73 2d 3e 78  R;.  }.  pVfs->x
fca0: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
fcb0: 28 70 56 66 73 2c 20 26 74 29 3b 0a 20 20 54 63  (pVfs, &t);.  Tc
fcc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
fcd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
fce0: 64 65 49 6e 74 4f 62 6a 28 74 29 29 3b 0a 20 20  deIntObj(t));.  
fcf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
fd00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fd10: 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
fd20: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
fd30: 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
fd40: 74 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73  t DB DBNAME.*/.s
fd50: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
fd60: 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 76  napshot_get(.  v
fd70: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
fd80: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
fd90: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
fda0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
fdb0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
fdc0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
fdd0: 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
fde0: 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  zName;.  sqlite3
fdf0: 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
fe00: 73 68 6f 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  shot = 0;..  if(
fe10: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
fe20: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fe30: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
fe40: 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a  , "DB DBNAME");.
fe50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fe60: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
fe70: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
fe80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
fe90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
fea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
feb0: 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  RROR;.  zName = 
fec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
fed0: 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20  jv[2]);..  rc = 
fee0: 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
fef0: 5f 67 65 74 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  _get(db, zName, 
ff00: 26 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 69  &pSnapshot);.  i
ff10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ff20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
ff30: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
ff40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ff50: 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  j(sqlite3ErrName
ff60: 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  (rc), -1));.    
ff70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
ff90: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
ffa0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
ffb0: 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
ffc0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
ffd0: 53 6e 61 70 73 68 6f 74 29 20 29 20 72 65 74 75  Snapshot) ) retu
ffe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fff0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10000 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
10010 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 75 66  ewStringObj(zBuf
10020 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65  , -1));.  }.  re
10030 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
10040 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10050 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20  ENABLE_SNAPSHOT 
10060 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
10070 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
10080 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  T./*.** Usage: s
10090 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
100a0 6f 70 65 6e 20 44 42 20 44 42 4e 41 4d 45 20 53  open DB DBNAME S
100b0 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61 74 69  NAPSHOT.*/.stati
100c0 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 61 70 73  c int test_snaps
100d0 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64  hot_open(.  void
100e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
100f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10100 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10110 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10120 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
10130 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
10140 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  *db;.  char *zNa
10150 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  me;.  sqlite3_sn
10160 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
10170 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
10180 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
10190 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
101a0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
101b0 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 22 29  BNAME SNAPSHOT")
101c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
101d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
101e0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
101f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10200 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10210 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
10220 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20  _ERROR;.  zName 
10230 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
10240 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 70 53 6e 61  objv[2]);.  pSna
10250 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74 65 33  pshot = (sqlite3
10260 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74  _snapshot*)sqlit
10270 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
10280 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10290 6a 76 5b 33 5d 29 29 3b 0a 0a 20 20 72 63 20 3d  jv[3]));..  rc =
102a0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
102b0 74 5f 6f 70 65 6e 28 64 62 2c 20 7a 4e 61 6d 65  t_open(db, zName
102c0 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20  , pSnapshot);.  
102d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
102e0 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
102f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
10300 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10310 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  bj(sqlite3ErrNam
10320 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20  e(rc), -1));.   
10330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10340 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
10350 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
10360 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
10370 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23  E_SNAPSHOT */..#
10380 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10390 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a  BLE_SNAPSHOT./*.
103a0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
103b0 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 20  3_snapshot_free 
103c0 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61 74  SNAPSHOT.*/.stat
103d0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 61 70  ic int test_snap
103e0 73 68 6f 74 5f 66 72 65 65 28 0a 20 20 76 6f 69  shot_free(.  voi
103f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10400 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10410 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10420 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10430 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
10440 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
10450 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 20 20 69 66  *pSnapshot;.  if
10460 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10470 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10480 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
10490 76 2c 20 22 53 4e 41 50 53 48 4f 54 22 29 3b 0a  v, "SNAPSHOT");.
104a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
104b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 53 6e 61  RROR;.  }.  pSna
104c0 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74 65 33  pshot = (sqlite3
104d0 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74  _snapshot*)sqlit
104e0 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
104f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10500 6a 76 5b 31 5d 29 29 3b 0a 20 20 73 71 6c 69 74  jv[1]));.  sqlit
10510 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65  e3_snapshot_free
10520 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 72  (pSnapshot);.  r
10530 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10540 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10550 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10560 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
10570 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
10580 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  OT./*.** Usage: 
10590 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
105a0 5f 63 6d 70 20 53 4e 41 50 53 48 4f 54 31 20 53  _cmp SNAPSHOT1 S
105b0 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74 61 74  NAPSHOT2.*/.stat
105c0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 61 70  ic int test_snap
105d0 73 68 6f 74 5f 63 6d 70 28 0a 20 20 76 6f 69 64  shot_cmp(.  void
105e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
105f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10600 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10610 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10620 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
10630 74 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  t res;.  sqlite3
10640 5f 73 6e 61 70 73 68 6f 74 20 2a 70 31 3b 0a 20  _snapshot *p1;. 
10650 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10660 74 20 2a 70 32 3b 0a 20 20 69 66 28 20 6f 62 6a  t *p2;.  if( obj
10670 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
10680 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10690 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
106a0 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f  NAPSHOT1 SNAPSHO
106b0 54 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  T2");.    return
106c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
106d0 20 20 70 31 20 3d 20 28 73 71 6c 69 74 65 33 5f    p1 = (sqlite3_
106e0 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65  snapshot*)sqlite
106f0 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54  3TestTextToPtr(T
10700 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10710 76 5b 31 5d 29 29 3b 0a 20 20 70 32 20 3d 20 28  v[1]));.  p2 = (
10720 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10730 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  *)sqlite3TestTex
10740 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
10750 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a  ring(objv[2]));.
10760 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f    res = sqlite3_
10770 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28 70 31 2c  snapshot_cmp(p1,
10780 20 70 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   p2);.  Tcl_SetO
10790 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
107a0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
107b0 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  es));.  return T
107c0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
107d0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
107e0 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 2f 2a  _SNAPSHOT */../*
107f0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
10800 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44  te3_next_stmt  D
10810 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  B  STMT.**.** Re
10820 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 73 74  turn the next st
10830 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75 65 6e  atment in sequen
10840 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a  ce after STMT..*
10850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
10860 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20 76  t_next_stmt(.  v
10870 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10880 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10890 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
108a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
108b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
108c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
108d0 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  Stmt;.  sqlite3 
108e0 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  *db = 0;.  char 
108f0 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28  zBuf[50];..  if(
10900 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
10910 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10920 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
10930 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
10940 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
10950 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10960 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
10970 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29 3b   " DB STMT", 0);
10980 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10990 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
109a0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
109b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
109c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
109d0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
109e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65  _ERROR;.  if( ge
109f0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10a00 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10a10 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53  ng(objv[2]), &pS
10a20 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10a30 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74  L_ERROR;.  pStmt
10a40 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f   = sqlite3_next_
10a50 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29 3b  stmt(db, pStmt);
10a60 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
10a70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
10a80 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
10a90 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
10aa0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10ab0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
10ac0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10ad0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
10ae0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
10af0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
10b00 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
10b10 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53  stmt_readonly  S
10b20 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
10b30 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73   true if STMT is
10b40 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
10b50 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
10b60 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
10b70 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
10b80 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 64  d to leave the d
10b90 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66 69  atabase unmodifi
10ba0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
10bb0 74 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64  t test_stmt_read
10bc0 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  only(.  void * c
10bd0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10be0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10bf0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10c00 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10c10 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10c20 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
10c30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
10c40 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10c50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10c60 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10c70 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10c80 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
10c90 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10ca0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10cb0 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
10cc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10cd0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
10ce0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10cf0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10d00 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10d10 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10d20 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
10d30 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
10d40 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20  donly(pStmt);.  
10d50 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10d60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
10d70 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b  BooleanObj(rc));
10d80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
10d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
10da0 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  :  sqlite3_stmt_
10db0 62 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  busy  STMT.**.**
10dc0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
10dd0 53 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55  STMT is a non-NU
10de0 4c 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  LL pointer to a 
10df0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61  statement.** tha
10e00 74 20 68 61 73 20 62 65 65 6e 20 73 74 65 70 70  t has been stepp
10e10 65 64 20 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f  ed but not to co
10e20 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  mpletion..*/.sta
10e30 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
10e40 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64 20 2a  t_busy(.  void *
10e50 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10e60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10e70 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10e80 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
10e90 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
10ea0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
10eb0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
10ec0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10ed0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10ee0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10ef0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10f00 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10f10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10f20 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10f30 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
10f40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10f50 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
10f60 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
10f70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10f80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10f90 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10fa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
10fb0 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  = sqlite3_stmt_b
10fc0 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63  usy(pStmt);.  Tc
10fd0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10fe0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
10ff0 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20  oleanObj(rc));. 
11000 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11010 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
11020 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e   uses_stmt_journ
11030 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  al  STMT.**.** R
11040 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54  eturn true if ST
11050 4d 54 20 75 73 65 73 20 61 20 73 74 61 74 65 6d  MT uses a statem
11060 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
11070 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 73 5f  static int uses_
11080 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20  stmt_journal(.  
11090 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
110a0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
110b0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
110c0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
110d0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
110e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
110f0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
11100 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
11110 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11120 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
11130 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
11140 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
11150 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11160 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
11170 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
11180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11190 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
111a0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
111b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
111c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
111d0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
111e0 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
111f0 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70  _stmt_readonly(p
11200 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
11210 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11220 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
11230 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70 53 74  Obj(((Vdbe *)pSt
11240 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  mt)->usesStmtJou
11250 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rnal));.  return
11260 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
11270 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
11280 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a  e3_reset  STMT .
11290 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 74  **.** Reset a st
112a0 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
112b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
112c0 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64  st_reset(.  void
112d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
112e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
112f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
11300 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
11310 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
11320 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
11330 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
11340 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
11350 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11360 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
11370 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
11380 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
11390 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
113a0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
113b0 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
113c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
113d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
113e0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
113f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
11400 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11410 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
11420 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
11430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
11440 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  eset(pStmt);.  i
11450 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69  f( pStmt && sqli
11460 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
11470 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
11480 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20  pStmt), rc) ){. 
11490 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
114a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  ROR;.  }.  Tcl_S
114b0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
114c0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
114d0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
114e0 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20  ATIC);./*.  if( 
114f0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
11500 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11510 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
11520 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
11530 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 70  ge:  sqlite3_exp
11540 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ired STMT .**.**
11550 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
11560 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  a recompilation 
11570 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
11580 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e   is recommended.
11590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
115a0 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76  est_expired(.  v
115b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
115c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
115d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
115e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
115f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
11600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11610 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
11620 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11630 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  tmt;.  if( objc!
11640 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
11650 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11660 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11670 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11680 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
11690 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
116a0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
116b0 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
116c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
116d0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
116e0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
116f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11700 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
11710 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11720 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
11730 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
11740 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
11750 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65  j(sqlite3_expire
11760 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64  d(pStmt)));.#end
11770 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
11780 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
11790 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61  ge:  sqlite3_tra
117a0 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46  nsfer_bindings F
117b0 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a  ROMSTMT TOSTMT.*
117c0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c  *.** Transfer al
117d0 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20  l bindings from 
117e0 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f  FROMSTMT over to
117f0 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69   TOSTMT.*/.stati
11800 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e 73  c int test_trans
11810 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64  fer_bind(.  void
11820 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
11830 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11840 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
11850 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
11860 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
11870 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11880 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c  DEPRECATED.  sql
11890 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
118a0 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66  1, *pStmt2;.  if
118b0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
118c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
118d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
118e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
118f0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
11900 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11910 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
11920 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f  , " FROM-STMT TO
11930 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20  -STMT", 0);.    
11940 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11950 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
11960 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
11970 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11980 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
11990 74 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t1)) return TCL_
119a0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74  ERROR;.  if( get
119b0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
119c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
119d0 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74  g(objv[2]), &pSt
119e0 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c  mt2)) return TCL
119f0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
11a00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11a10 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77  p, .     Tcl_New
11a20 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74  IntObj(sqlite3_t
11a30 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
11a40 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29  (pStmt1,pStmt2))
11a50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
11a60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
11a70 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
11a80 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a  te3_changes DB.*
11a90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11aa0 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
11ab0 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
11ac0 74 61 62 61 73 65 20 62 79 20 74 68 65 20 6c 61  tabase by the la
11ad0 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74  st SQL.** execut
11ae0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
11af0 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28  nt test_changes(
11b00 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
11b10 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
11b20 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
11b30 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
11b40 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
11b50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
11b60 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
11b70 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
11b80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11b90 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
11ba0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
11bb0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
11bc0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
11bd0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
11be0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11bf0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
11c00 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
11c10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11c20 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
11c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11c40 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
11c50 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
11c60 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
11c70 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20  hanges(db)));.  
11c80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11c90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
11ca0 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64  the "static_bind
11cb0 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61 72  _value" that var
11cc0 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64  iables are bound
11cd0 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20   to when.** the 
11ce0 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73  FLAG option of s
11cf0 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22  qlite3_bind is "
11d00 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69  static".*/.stati
11d10 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73  c char *sqlite_s
11d20 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
11d30 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
11d40 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
11d50 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a  ind_nbyte = 0;..
11d60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
11d70 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20  lite3_bind  VM  
11d80 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47  IDX  VALUE  FLAG
11d90 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65  S.**.** Sets the
11da0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44   value of the ID
11db0 58 2d 74 68 20 6f 63 63 75 72 72 65 6e 63 65 20  X-th occurrence 
11dc0 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72  of "?" in the or
11dd0 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74  iginal SQL.** st
11de0 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20  ring.  VALUE is 
11df0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20  the new value.  
11e00 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22  If FLAGS=="null"
11e10 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a   then VALUE is.*
11e20 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68  * ignored and th
11e30 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
11e40 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47  o NULL.  If FLAG
11e50 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e  S=="static" then
11e60 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73  .** the value is
11e70 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
11e80 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61  e of a static va
11e90 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20  riable named.** 
11ea0 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
11eb0 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20  ind_value".  If 
11ec0 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20  FLAGS=="normal" 
11ed0 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  then a copy.** o
11ee0 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d  f the VALUE is m
11ef0 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ade.  If FLAGS==
11f00 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61 20  "blob10" then a 
11f10 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65 64  VALUE is ignored
11f20 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74 65  .** an a 10-byte
11f30 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78 79   blob "abc\000xy
11f40 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73 65  z\000pq" is inse
11f50 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rted..*/.static 
11f60 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20  int test_bind(. 
11f70 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
11f80 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11f90 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
11fa0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
11fb0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
11fc0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
11fd0 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
11fe0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11ff0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
12000 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
12010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
12020 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
12030 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
12040 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
12050 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
12060 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  dx;.  if( argc!=
12070 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
12080 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12090 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
120a0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
120b0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
120c0 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20   " VM IDX VALUE 
120d0 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72  (null|static|nor
120e0 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20  mal)\"", 0);.   
120f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12100 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
12110 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
12120 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53  rp, argv[1], &pS
12130 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
12140 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
12150 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
12160 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29  , argv[2], &idx)
12170 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12180 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  ROR;.  if( strcm
12190 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22  p(argv[4],"null"
121a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
121b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
121c0 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
121d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
121e0 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74  mp(argv[4],"stat
121f0 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ic")==0 ){.    r
12200 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
12210 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
12220 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  , sqlite_static_
12230 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20  bind_value, -1, 
12240 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
12250 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
12260 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d  static-nbytes")=
12270 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
12280 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
12290 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
122a0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
122b0 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  value,.         
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
122e0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
122f0 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65  _nbyte, 0);.  }e
12300 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
12310 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29  rgv[4],"normal")
12320 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
12330 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
12340 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72  t(pStmt, idx, ar
12350 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[3], -1, SQLIT
12360 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
12370 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12380 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30  (argv[4],"blob10
12390 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
123a0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
123b0 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
123c0 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70  "abc\000xyz\000p
123d0 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53  q", 10, SQLITE_S
123e0 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
123f0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
12400 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34  esult(interp, "4
12410 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  th argument shou
12420 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
12430 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73  "\"null\" or \"s
12440 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72  tatic\" or \"nor
12450 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  mal\"", 0);.    
12460 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12470 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
12480 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
12490 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
124a0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
124b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
124c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
124d0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
124e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
124f0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
12500 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  , zBuf, "(%d) ",
12510 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
12520 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12530 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
12540 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
12550 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12560 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
12570 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
12580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12590 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73  T_UTF16./*.** Us
125a0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
125b0 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c  llate <db ptr> <
125c0 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
125d0 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20  <utf16be>.**.** 
125e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
125f0 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
12600 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  at SQLite select
12610 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  s the correct co
12620 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65  llation.** seque
12630 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  nce callback whe
12640 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
12650 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
12660 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
12670 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
12680 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
12690 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
126a0 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63 6f  registers the co
126b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
126c0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a   "test_collate".
126d0 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ** with database
126e0 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68   handle <db>. Th
126f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12700 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74  t must be a list
12710 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f   of three.** boo
12720 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20  lean values. If 
12730 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75  the first is tru
12740 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
12750 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  n of test_collat
12760 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72  e is.** register
12770 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
12780 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74   the second is t
12790 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
127a0 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
127b0 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  .** UTF-16le, if
127c0 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74 72   the third is tr
127d0 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76  ue, a UTF-16be v
127e0 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
127f0 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73  ble..** Previous
12800 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73   versions of tes
12810 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65  t_collate are de
12820 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
12830 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12840 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  nce test_collate
12850 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
12860 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a  by calling the.*
12870 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  * following TCL 
12880 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
12890 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65  "test_collate <e
128a0 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22  nc> <lhs> <rhs>"
128b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e  .**.** The <lhs>
128c0 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74   and <rhs> are t
128d0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65  he two values be
128e0 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e  ing compared, en
128f0 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  coded in UTF-8..
12900 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72  ** The <enc> par
12910 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 6e  ameter is the en
12920 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f  coding of the co
12930 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
12940 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20   that.** SQLite 
12950 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c  selected to call
12960 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20 73  . The TCL test s
12970 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73  cript implements
12980 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f   the.** "test_co
12990 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a  llate" proc..**.
129a0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
129b0 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b  s will only work
129c0 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 72 70   with one interp
129d0 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
129e0 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
129f0 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
12a00 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
12a10 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
12a20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
12a30 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
12a40 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
12a50 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
12a60 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
12a70 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
12a80 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
12a90 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
12aa0 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
12ab0 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
12ac0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
12ad0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
12ae0 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
12af0 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
12b00 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  in = SQLITE_PTR_
12b10 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20  TO_INT(pCtx);.  
12b20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
12b30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
12b40 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f  ue *pVal;.  Tcl_
12b50 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d  Obj *pX;..  pX =
12b60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12b70 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  j("test_collate"
12b80 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
12b90 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a  rRefCount(pX);..
12ba0 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20    switch( encin 
12bb0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
12bc0 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54  TE_UTF8:.      T
12bd0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12be0 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
12bf0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
12c00 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20  TF-8",-1));.    
12c10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12c20 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  e SQLITE_UTF16LE
12c30 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
12c40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12c50 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
12c60 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
12c70 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
12c80 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
12c90 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20  LITE_UTF16BE:.  
12ca0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
12cb0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
12cc0 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
12cd0 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31  bj("UTF-16BE",-1
12ce0 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
12cf0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
12d00 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
12d10 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67   }..  sqlite3Beg
12d20 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
12d30 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
12d40 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
12d50 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
12d60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12d70 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41  Str(pVal, nA, zA
12d80 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
12d90 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
12da0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
12db0 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
12dc0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12dd0 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
12de0 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
12df0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
12e00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12e10 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
12e20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12e30 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42  Str(pVal, nB, zB
12e40 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
12e50 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
12e60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
12e70 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
12e80 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12e90 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
12ea0 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
12eb0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
12ec0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12ed0 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
12ee0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
12ef0 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e(pVal);.  }.  s
12f00 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
12f10 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f  alloc();..  Tcl_
12f20 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c  EvalObjEx(i, pX,
12f30 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
12f40 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
12f50 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12f60 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  (i, Tcl_GetObjRe
12f70 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a  sult(i), &res);.
12f80 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
12f90 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
12fa0 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  collate(.  void 
12fb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12fc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12fd0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
12fe0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
12ff0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
13000 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
13010 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  val;.  sqlite3_v
13020 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
13030 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
13040 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=5 ) goto bad_
13050 61 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c  args;.  pTestCol
13060 6c 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74  lateInterp = int
13070 65 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62  erp;.  if( getDb
13080 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
130a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
130b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
130c0 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
130d0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
130e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
130f0 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
13100 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13110 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13120 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
13130 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
13140 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  te", SQLITE_UTF8
13150 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f  , .          (vo
13160 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38  id *)SQLITE_UTF8
13170 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
13180 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66  te_func:0);.  if
13190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
131a0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  ){.    const voi
131b0 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69  d *zUtf16;.    i
131c0 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
131d0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
131e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
131f0 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
13200 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13210 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
13220 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
13230 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
13240 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
13250 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
13260 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
13270 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16LE, val?test_
13280 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
13290 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
132a0 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
132b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
132c0 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[4], &val) ) 
132d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
132e0 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28  ;..#if 0.    if(
132f0 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
13300 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  Fail>0 ){.      
13310 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
13320 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  ail++;.    }.#en
13330 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
13340 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
13350 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c  mutex);.    pVal
13360 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
13370 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
13380 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
13390 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63  Val, -1, "test_c
133a0 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
133b0 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
133c0 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36  TIC);.    zUtf16
133d0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
133e0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
133f0 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
13400 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
13410 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
13420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
13430 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
13440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13450 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13460 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c  on16(db, zUtf16,
13470 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
13480 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
13490 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
134a0 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  BE, val?test_col
134b0 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
134c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
134d0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
134e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
134f0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
13500 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  x);.  }.  if( sq
13510 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
13520 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
13530 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13540 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63  ROR;.  .  if( rc
13550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13560 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13570 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
13580 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
13590 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
135a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
135b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
135c0 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
135d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
135e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
135f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
13600 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ",.      Tcl_Get
13610 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
13620 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42  jv[0], 0), " <DB
13630 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
13640 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30  e> <utf16be>", 0
13650 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
13660 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
13670 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
13680 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
13690 20 3c 64 62 20 70 74 72 3e 0a 2a 2a 0a 2a 2a 20   <db ptr>.**.** 
136a0 41 64 64 20 61 20 75 74 66 2d 31 36 20 63 6f 6c  Add a utf-16 col
136b0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
136c0 6e 61 6d 65 64 20 22 75 74 66 31 36 62 69 6e 22  named "utf16bin"
136d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
136e0 0a 2a 2a 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  .** handle. This
136f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13700 6e 63 65 20 63 6f 6d 70 61 72 65 73 20 61 72 67  nce compares arg
13710 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 61  uments in the sa
13720 6d 65 20 77 61 79 20 61 73 20 74 68 65 0a 2a 2a  me way as the.**
13730 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
13740 69 6f 6e 20 22 62 69 6e 61 72 79 22 2e 0a 2a 2f  ion "binary"..*/
13750 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
13760 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
13770 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  e_func(.  void *
13780 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c  pCtx, .  int nA,
13790 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
137a0 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74  .  int nB, const
137b0 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 69   void *zB.){.  i
137c0 6e 74 20 6e 43 6d 70 20 3d 20 28 6e 41 3e 6e 42  nt nCmp = (nA>nB
137d0 20 3f 20 6e 42 20 3a 20 6e 41 29 3b 0a 20 20 69   ? nB : nA);.  i
137e0 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
137f0 7a 41 2c 20 7a 42 2c 20 6e 43 6d 70 29 3b 0a 20  zA, zB, nCmp);. 
13800 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
13810 73 20 3d 20 6e 41 20 2d 20 6e 42 3b 0a 20 20 72  s = nA - nB;.  r
13820 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61  eturn res;.}.sta
13830 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 74 66  tic int test_utf
13840 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 28 0a 20  16bin_collate(. 
13850 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
13860 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
13870 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
13880 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
13890 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
138a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
138b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
138c0 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20   objc!=2 ) goto 
138d0 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
138e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
138f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
13900 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
13910 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13920 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
13930 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13940 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31  lation(db, "utf1
13950 36 62 69 6e 22 2c 20 53 51 4c 49 54 45 5f 55 54  6bin", SQLITE_UT
13960 46 31 36 2c 20 30 2c 20 0a 20 20 20 20 20 20 74  F16, 0, .      t
13970 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
13980 6c 61 74 65 5f 66 75 6e 63 0a 20 20 29 3b 0a 20  late_func.  );. 
13990 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
139a0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
139b0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
139c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
139d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
139e0 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72  d_args:.  Tcl_Wr
139f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13a00 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
13a10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
13a20 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
13a30 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69  When the collati
13a40 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61  on needed callba
13a50 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72  ck is invoked, r
13a60 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f  ecord the name o
13a70 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  f .** the reques
13a80 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ted collating fu
13a90 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68  nction here.  Th
13aa0 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20  e recorded name 
13ab0 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20  is linked.** to 
13ac0 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61  a TCL variable a
13ad0 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  nd used to make 
13ae0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
13af0 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
13b00 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72  n.** name is cor
13b10 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
13b20 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  char zNeededColl
13b30 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74  ation[200];.stat
13b40 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65  ic char *pzNeede
13b50 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65  dCollation = zNe
13b60 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a  ededCollation;..
13b70 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
13b80 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  en a collating s
13b90 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65  equence is neede
13ba0 64 2e 20 20 52 65 67 69 73 74 65 72 65 64 20 75  d.  Registered u
13bb0 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
13bc0 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
13bd0 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  16()..*/.static 
13be0 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74  void test_collat
13bf0 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76  e_needed_cb(.  v
13c00 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71  oid *pCtx, .  sq
13c10 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
13c20 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e   eTextRep,.  con
13c30 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29  st void *pName.)
13c40 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e  {.  int enc = EN
13c50 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  C(db);.  int i;.
13c60 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72    char *z;.  for
13c70 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d  (z = (char*)pNam
13c80 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b  e, i=0; *z || z[
13c90 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  1]; z++){.    if
13ca0 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f  ( *z ) zNeededCo
13cb0 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a  llation[i++] = *
13cc0 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64  z;.  }.  zNeeded
13cd0 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30  Collation[i] = 0
13ce0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
13cf0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
13d00 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f      db, "test_co
13d10 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c  llate", ENC(db),
13d20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
13d30 54 52 28 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f  TR(enc), test_co
13d40 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a  llate_func);.}..
13d50 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
13d60 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65  _test_collate_ne
13d70 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69  eded DB.*/.stati
13d80 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61  c int test_colla
13d90 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69  te_needed(.  voi
13da0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
13db0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
13dc0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
13dd0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
13de0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
13df0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
13e00 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
13e10 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=2 ) goto bad_
13e20 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44  args;.  if( getD
13e30 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
13e40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
13e50 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
13e60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13e80 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
13e90 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f  d16(db, 0, test_
13ea0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
13eb0 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c  b);.  zNeededCol
13ec0 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20  lation[0] = 0;. 
13ed0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
13ee0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
13ef0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
13f00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
13f10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
13f20 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72  d_args:.  Tcl_Wr
13f30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13f40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
13f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
13f60 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
13f70 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c  tclcmd:   add_al
13f80 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
13f90 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a  lations  DB.**.*
13fa0 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f  * Add two new co
13fb0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13fc0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
13fd0 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75  e DB.**.**     u
13fe0 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20  tf16_aligned.** 
13ff0 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67      utf16_unalig
14000 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63  ned.**.** Both c
14010 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
14020 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  es use the same 
14030 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49  sort order as BI
14040 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  NARY..** The onl
14050 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  y difference is 
14060 74 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61  that the utf16_a
14070 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  ligned collating
14080 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20  .** sequence is 
14090 64 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68  declared with th
140a0 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  e SQLITE_UTF16_A
140b0 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20  LIGNED flag..** 
140c0 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66  Both collating f
140d0 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65  unctions increme
140e0 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  nt the unaligned
140f0 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a   utf16 counter.*
14100 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20  * whenever they 
14110 73 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  see a string tha
14120 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f  t begins on an o
14130 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79  dd byte boundary
14140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14150 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
14160 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74  _counter = 0;.st
14170 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65  atic int alignme
14180 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  ntCollFunc(.  vo
14190 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
141a0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
141b0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
141c0 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
141d0 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
141e0 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
141f0 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
14200 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
14210 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20   if( nKey1>0 && 
14220 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54  1==(1&(SQLITE_PT
14230 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29  R_TO_INT(pKey1))
14240 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
14250 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
14260 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26    if( nKey2>0 &&
14270 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50   1==(1&(SQLITE_P
14280 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29  TR_TO_INT(pKey2)
14290 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73  )) ) unaligned_s
142a0 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b  tring_counter++;
142b0 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
142c0 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
142d0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
142e0 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
142f0 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65   nKey2;.  }.  re
14300 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
14310 63 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d  c int add_alignm
14320 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69  ent_test_collati
14330 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ons(.  void * cl
14340 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14350 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14360 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14370 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14380 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14390 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63   *db;.  if( objc
143a0 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67  >=2 ){.    if( g
143b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
143c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
143d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
143e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
143f0 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
14400 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
14410 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61  n(db, "utf16_una
14420 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f  ligned", SQLITE_
14430 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20  UTF16, .        
14440 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
14450 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  Func);.    sqlit
14460 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
14470 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61  ion(db, "utf16_a
14480 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f  ligned", SQLITE_
14490 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a  UTF16_ALIGNED, .
144a0 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e          0, align
144b0 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20  mentCollFunc);. 
144c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
144d0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
144e0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
144f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a  TE_OMIT_UTF16) *
14500 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  /../*.** Usage: 
14510 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
14520 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38  n <db ptr> <utf8
14530 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
14540 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  16be>.**.** This
14550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
14560 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  d to test that S
14570 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68  QLite selects th
14580 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a  e correct user.*
14590 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62  * function callb
145a0 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c  ack when multipl
145b0 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20  e versions (for 
145c0 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65  different text e
145d0 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65  ncodings).** are
145e0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
145f0 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
14600 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
14610 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72   up to three ver
14620 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65  sions of the use
14630 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74  r function.** "t
14640 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69  est_function" wi
14650 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
14660 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65  le <db>.  If the
14670 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14680 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
14690 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
146a0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20  est_function is 
146b0 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
146c0 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20  TF-8, if the.** 
146d0 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
146e0 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
146f0 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31  stered for UTF-1
14700 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72  6le, if the four
14710 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61  th is.** true, a
14720 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
14730 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  n is available. 
14740 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
14750 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75  ns of.** test_fu
14760 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74  nction are delet
14770 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73  ed..**.** The us
14780 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
14790 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
147a0 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  lling the follow
147b0 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
147c0 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75  **.**   "test_fu
147d0 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72  nction <enc> <ar
147e0 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  g>".**.** Where 
147f0 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20  <enc> is one of 
14800 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20  UTF-8, UTF-16LE 
14810 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20  or UTF16BE, and 
14820 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20  <arg> is the.** 
14830 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
14840 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51  passed to the SQ
14850 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  L function. The 
14860 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
14870 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72  y.** the TCL scr
14880 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74  ipt is used as t
14890 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
148a0 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  of the SQL funct
148b0 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61  ion. It.** is pa
148c0 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75  ssed to SQLite u
148d0 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f  sing UTF-16BE fo
148e0 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66  r a UTF-8 test_f
148f0 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38  unction(), UTF-8
14900 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36  .** for a UTF-16
14910 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  LE test_function
14920 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45  (), and UTF-16LE
14930 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e   for an implemen
14940 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70  tation that.** p
14950 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e  refers UTF-16BE.
14960 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14970 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
14980 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
14990 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20  unction_utf8(.  
149a0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
149b0 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
149c0 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
149d0 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
149e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
149f0 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
14a00 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
14a10 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
14a20 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
14a30 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
14a40 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
14a50 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
14a60 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
14a70 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
14a80 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
14a90 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
14aa0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14ab0 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
14ac0 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38  StringObj("UTF-8
14ad0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
14ae0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14af0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
14b00 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
14b10 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
14b20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14b30 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
14b40 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
14b50 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
14b60 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
14b70 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69  ount(pX);.  sqli
14b80 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
14b90 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72  pCtx, Tcl_GetStr
14ba0 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
14bb0 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ), -1, SQLITE_TR
14bc0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c  ANSIENT);.  pVal
14bd0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14be0 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
14bf0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
14c00 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
14c10 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
14c20 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
14c30 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
14c40 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
14c50 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
14c60 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
14c70 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56  alue_text16be(pV
14c80 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
14c90 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14ca0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14cb0 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
14cc0 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
14cd0 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28  unction_utf16le(
14ce0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
14cf0 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
14d00 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
14d10 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
14d20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14d30 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
14d40 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
14d50 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
14d60 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
14d70 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
14d80 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
14d90 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
14da0 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
14db0 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
14dc0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
14dd0 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
14de0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
14df0 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
14e00 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
14e10 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16LE", -1));. 
14e20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14e30 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14e40 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
14e50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
14e60 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
14e70 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
14e80 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
14e90 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
14ea0 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
14eb0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
14ec0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
14ed0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
14ee0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
14ef0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
14f00 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
14f10 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
14f20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
14f30 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
14f40 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
14f50 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73  xt(pCtx,(char*)s
14f60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14f70 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54  t(pVal),-1,SQLIT
14f80 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
14f90 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
14fa0 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  (pVal);.}.static
14fb0 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74   void test_funct
14fc0 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73  ion_utf16be(.  s
14fd0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
14fe0 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
14ff0 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
15000 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
15010 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15020 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
15030 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
15040 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
15050 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
15060 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
15070 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
15080 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
15090 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
150a0 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
150b0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
150c0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
150d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
150e0 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
150f0 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
15100 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  BE", -1));.  Tcl
15110 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15120 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
15130 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
15140 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
15150 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
15160 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
15170 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
15180 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
15190 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
151a0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56  fCount(pX);.  pV
151b0 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
151c0 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
151d0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
151e0 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53  al, -1, Tcl_GetS
151f0 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
15200 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49  rp), .      SQLI
15210 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
15220 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
15230 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
15240 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
15250 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
15260 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
15270 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
15280 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
15290 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78  lt_text16be(pCtx
152a0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
152b0 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
152c0 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
152d0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
152e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
152f0 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c  xt16le(pCtx, sql
15300 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
15310 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6le(pVal),.     
15320 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
15330 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
15340 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
15350 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15360 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
15370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15380 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  st_function(.  v
15390 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
153a0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
153b0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
153c0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
153d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
153e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
153f0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
15400 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
15410 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
15420 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
15430 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
15440 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
15450 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15460 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
15470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
15480 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
15490 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
154a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
154b0 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
154c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
154d0 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
154e0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
154f0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
15500 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
15510 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
15520 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
15530 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38  st_function_utf8
15540 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
15550 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
15560 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
15570 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
15580 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
15590 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
155a0 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  ( val ){.    sql
155b0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
155c0 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66  tion(db, "test_f
155d0 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c  unction", 1, SQL
155e0 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20  ITE_UTF16LE, .  
155f0 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
15600 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
15610 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  6le, 0, 0);.  }.
15620 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
15630 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
15640 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15650 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
15660 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15670 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
15680 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
15690 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
156a0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
156b0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
156c0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
156d0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
156e0 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20  tf16be, 0, 0);. 
156f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
15700 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20  _OK;.bad_args:. 
15710 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15720 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
15730 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
15740 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63  be \"",.      Tc
15750 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
15760 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
15770 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75  " <DB> <utf8> <u
15780 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
15790 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  >", 0);.#endif /
157a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
157b0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
157c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
157d0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20  .** Usage:      
157e0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
157f0 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65  errstr <err code
15800 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61  >.**.** Test tha
15810 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  t the english la
15820 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71  nguage string eq
15830 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71  uivalents for sq
15840 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73  lite error codes
15850 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68  .** are sane. Th
15860 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  e parameter is a
15870 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
15880 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  enting an sqlite
15890 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
158a0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
158b0 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d  list of two elem
158c0 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67  ents, the string
158d0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
158e0 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  of the.** error 
158f0 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67  code and the eng
15900 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
15910 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  planation..*/.st
15920 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
15930 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  rstr(.  void * c
15940 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
15950 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15960 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
15970 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
15980 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a  jv[].){.  char *
15990 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  zCode;.  int i;.
159a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
159b0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
159c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
159d0 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63   objv, "<error c
159e0 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a  ode>");.  }..  z
159f0 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Code = Tcl_GetSt
15a00 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
15a10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b   for(i=0; i<200;
15a20 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30   i++){.    if( 0
15a30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72  ==strcmp(t1Error
15a40 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20  Name(i), zCode) 
15a50 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ) break;.  }.  T
15a60 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
15a70 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
15a80 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30  ite3ErrStr(i), 0
15a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
15aa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
15ab0 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e  ge:    breakpoin
15ac0 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  t.**.** This rou
15ad0 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20  tine exists for 
15ae0 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f  one purpose - to
15af0 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65   provide a place
15b00 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65   to put a.** bre
15b10 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42  akpoint with GDB
15b20 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69   that can be tri
15b30 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c  ggered using TCL
15b40 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a   code.  The use.
15b50 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77  ** for this is w
15b60 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72  hen a particular
15b70 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28   test fails on (
15b80 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20  say) the 1485th 
15b90 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e  iteration..** In
15ba0 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   the TCL test sc
15bb0 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64  ript, we can add
15bc0 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a   code like this:
15bd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24  .**.**     if {$
15be0 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f  i==1485} breakpo
15bf0 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72  int.**.** Then r
15c00 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69  un testfixture i
15c10 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61  n the debugger a
15c20 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20  nd wait for the 
15c30 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a  breakpoint to.**
15c40 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64   fire.  Then add
15c50 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69  itional breakpoi
15c60 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74  nts can be set t
15c70 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65  o trace down the
15c80 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   bug..*/.static 
15c90 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  int test_breakpo
15ca0 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
15cb0 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
15cc0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
15cd0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
15ce0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
15cf0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
15d00 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
15d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15d20 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
15d30 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
15d40 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
15d50 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
15d60 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
15d70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
15d80 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
15d90 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
15da0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
15db0 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
15dc0 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
15dd0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
15de0 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
15df0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
15e00 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
15e10 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44  statement..** ID
15e20 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  X is the index o
15e30 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
15e40 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
15e50 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
15e60 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
15e70 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c   N-byte zero-fil
15e80 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  led BLOB to the 
15e90 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
15ea0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
15eb0 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f  d_zeroblob(.  vo
15ec0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
15ed0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15ee0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15ef0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15f00 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
15f10 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
15f20 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
15f30 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72    int n;.  int r
15f40 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
15f50 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
15f60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15f70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
15f80 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65   IDX N");.    re
15f90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15fa0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
15fb0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
15fc0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15fd0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
15fe0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15ff0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
16000 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16010 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
16020 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
16030 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
16040 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16050 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
16060 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
16070 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
16080 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a  = sqlite3_bind_z
16090 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  eroblob(pStmt, i
160a0 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
160b0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
160c0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
160d0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
160e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
160f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
16110 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16120 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16130 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16140 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
16150 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20 20  ind_zeroblob64  
16160 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a  STMT IDX N.**.**
16170 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
16180 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  3_bind_zeroblob6
16190 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
161a0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
161b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49   statement..** I
161c0 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  DX is the index 
161d0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
161e0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
161f0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
16200 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
16210 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69  a N-byte zero-fi
16220 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65  lled BLOB to the
16230 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
16240 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
16250 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 0a 20  nd_zeroblob64(. 
16260 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
16270 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
16280 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16290 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
162a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
162b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
162c0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
162d0 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  x;.  Tcl_WideInt
162e0 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   n;.  int rc;.. 
162f0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
16300 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16310 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
16320 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20  objv, "STMT IDX 
16330 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
16340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16350 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
16360 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16370 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16380 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
16390 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
163a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
163b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
163c0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
163d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
163e0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
163f0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
16400 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16410 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &n) ) return TC
16420 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
16430 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
16440 72 6f 62 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20  roblob64(pStmt, 
16450 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73  idx, n);.  if( s
16460 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
16470 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
16480 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
16490 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
164a0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
164b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
164c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
164d0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
164e0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
164f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16500 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
16510 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
16520 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
16530 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53  ite3_bind_int  S
16540 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
16550 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
16560 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65  e3_bind_int inte
16570 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
16580 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
16590 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
165a0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
165b0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
165c0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
165d0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
165e0 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74  * binds a 32-bit
165f0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
16600 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
16610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
16620 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20  est_bind_int(.  
16630 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16640 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16650 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16660 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
16670 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
16680 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16690 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
166a0 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20  ;.  int value;. 
166b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
166c0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
166d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
166e0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
166f0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
16700 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
16710 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
16720 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
16730 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
16740 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16750 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16760 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
16770 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16780 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16790 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
167a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
167b0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
167c0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
167d0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
167e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
167f0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
16800 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
16810 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
16820 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
16830 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
16840 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
16850 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
16860 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
16870 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
16880 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
16890 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
168a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
168b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
168c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
168d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
168e0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
168f0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
16900 67 65 3a 20 20 20 69 6e 74 61 72 72 61 79 5f 61  ge:   intarray_a
16910 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a  ddr  INT  ....**
16920 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
16930 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61  ddress of a C-la
16940 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66 20  nguage array of 
16950 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  32-bit integers.
16960 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
16970 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 69  hold the array i
16980 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
16990 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20  malloc().  Call 
169a0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f  this procedure o
169b0 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61  nce.** with no a
169c0 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65  rguments in orde
169d0 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  r to release mem
169e0 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  ory.  Each call 
169f0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  to this procedur
16a00 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  e.** overwrites 
16a10 74 68 65 20 70 72 65 76 69 6f 75 73 20 61 72 72  the previous arr
16a20 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
16a30 74 20 74 65 73 74 5f 69 6e 74 61 72 72 61 79 5f  t test_intarray_
16a40 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  addr(.  void * c
16a50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16a60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16a70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16a80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16a90 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
16aa0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 2a 70  .  static int *p
16ab0 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
16ac0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20  _free(p);.  p = 
16ad0 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20  0;.  if( objc>1 
16ae0 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
16af0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
16b00 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29  f(p[0])*(objc-1)
16b10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   );.    if( p==0
16b20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16b30 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ROR;.    for(i=0
16b40 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29  ; i<objc-1; i++)
16b50 7b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  {.      if( Tcl_
16b60 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16b70 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d 2c  terp, objv[1+i],
16b80 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20   &p[i]) ){.     
16b90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16ba0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
16bb0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
16bc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16bd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
16be0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
16bf0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
16c00 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73  NewWideIntObj((s
16c10 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29  qlite3_int64)p))
16c20 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
16c30 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  K;.}./*.** Usage
16c40 3a 20 20 20 69 6e 74 61 72 72 61 79 5f 61 64 64  :   intarray_add
16c50 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a  r  INT  ....**.*
16c60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
16c70 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67  ress of a C-lang
16c80 75 61 67 65 20 61 72 72 61 79 20 6f 66 20 33 32  uage array of 32
16c90 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 0a 2a  -bit integers..*
16ca0 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
16cb0 6c 64 20 74 68 65 20 61 72 72 61 79 20 69 73 20  ld the array is 
16cc0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
16cd0 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68  lloc().  Call th
16ce0 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63  is procedure onc
16cf0 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67  e.** with no arg
16d00 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20  uments in order 
16d10 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
16d20 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  y.  Each call to
16d30 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
16d40 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
16d50 65 20 70 72 65 76 69 6f 75 73 20 61 72 72 61 79  e previous array
16d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16d70 74 65 73 74 5f 69 6e 74 36 34 61 72 72 61 79 5f  test_int64array_
16d80 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  addr(.  void * c
16d90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16da0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16db0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16dc0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16dd0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
16de0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
16df0 33 5f 69 6e 74 36 34 20 2a 70 20 3d 20 30 3b 0a  3_int64 *p = 0;.
16e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16e10 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69  p);.  p = 0;.  i
16e20 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20  f( objc>1 ){.   
16e30 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
16e40 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d  loc( sizeof(p[0]
16e50 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20  )*(objc-1) );.  
16e60 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
16e70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16e80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62     for(i=0; i<ob
16e90 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  jc-1; i++){.    
16ea0 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b    Tcl_WideInt v;
16eb0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
16ec0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
16ed0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b  (interp, objv[1+
16ee0 69 5d 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  i], &v) ){.     
16ef0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16f00 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
16f10 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
16f20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16f30 20 20 20 7d 0a 20 20 20 20 20 20 70 5b 69 5d 20     }.      p[i] 
16f40 3d 20 76 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  = v;.    }.  }  
16f50 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
16f60 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
16f70 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73  NewWideIntObj((s
16f80 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29  qlite3_int64)p))
16f90 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
16fa0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  K;.}./*.** Usage
16fb0 3a 20 20 20 64 6f 75 62 6c 65 61 72 72 61 79 5f  :   doublearray_
16fc0 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a  addr  INT  ....*
16fd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16fe0 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c  address of a C-l
16ff0 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66  anguage array of
17000 20 64 6f 75 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20   doubles..**.** 
17010 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
17020 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
17030 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
17040 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72  ).  Call this pr
17050 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20  ocedure once.** 
17060 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
17070 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  s in order to re
17080 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45  lease memory.  E
17090 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
170a0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76   procedure.** ov
170b0 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
170c0 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  vious array..*/.
170d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
170e0 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72  doublearray_addr
170f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17100 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17110 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17120 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17130 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
17140 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
17150 74 61 74 69 63 20 64 6f 75 62 6c 65 20 2a 70 20  tatic double *p 
17160 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
17170 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20 30  free(p);.  p = 0
17180 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29  ;.  if( objc>1 )
17190 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
171a0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
171b0 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20  (p[0])*(objc-1) 
171c0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
171d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
171e0 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OR;.    for(i=0;
171f0 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b   i<objc-1; i++){
17200 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
17210 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
17220 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69  interp, objv[1+i
17230 5d 2c 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20  ], &p[i]) ){.   
17240 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17250 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  e(p);.        p 
17260 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
17270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17280 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17290 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52    .  Tcl_SetObjR
172a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
172b0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
172c0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
172d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
172e0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61  _OK;.}./*.** Usa
172f0 67 65 3a 20 20 20 74 65 78 74 61 72 72 61 79 5f  ge:   textarray_
17300 61 64 64 72 20 20 54 45 58 54 20 2e 2e 2e 0a 2a  addr  TEXT ....*
17310 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17320 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c  address of a C-l
17330 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66  anguage array of
17340 20 73 74 72 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20   strings..**.** 
17350 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
17360 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
17370 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
17380 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72  ).  Call this pr
17390 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20  ocedure once.** 
173a0 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
173b0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  s in order to re
173c0 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45  lease memory.  E
173d0 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
173e0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76   procedure.** ov
173f0 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
17400 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  vious array..*/.
17410 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17420 74 65 78 74 61 72 72 61 79 5f 61 64 64 72 28 0a  textarray_addr(.
17430 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17440 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17450 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17460 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17470 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17480 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  {.  int i;.  sta
17490 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
174a0 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 70   static char **p
174b0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
174c0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 73 71 6c 69  ; i<n; i++) sqli
174d0 74 65 33 5f 66 72 65 65 28 70 5b 69 5d 29 3b 0a  te3_free(p[i]);.
174e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
174f0 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69 66  );.  p = 0;.  if
17500 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20  ( objc>1 ){.    
17510 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
17520 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29  oc( sizeof(p[0])
17530 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20  *(objc-1) );.   
17540 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
17550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17560 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a    for(i=0; i<obj
17570 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  c-1; i++){.     
17580 20 70 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f   p[i] = sqlite3_
17590 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 54 63  mprintf("%s", Tc
175a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
175b0 5b 31 2b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  [1+i]));.    }. 
175c0 20 7d 0a 20 20 6e 20 3d 20 6f 62 6a 63 2d 31 3b   }.  n = objc-1;
175d0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
175e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
175f0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73  NewWideIntObj((s
17600 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29  qlite3_int64)p))
17610 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17620 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
17630 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
17640 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e  nd_int64  STMT N
17650 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
17660 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
17670 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61  nd_int64 interfa
17680 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
17690 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
176a0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
176b0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
176c0 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
176d0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
176e0 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
176f0 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
17700 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
17710 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
17720 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
17730 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76  _bind_int64(.  v
17740 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17750 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17760 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17770 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17780 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17790 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
177a0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
177b0 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76  .  Tcl_WideInt v
177c0 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
177d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
177e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
177f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17800 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
17810 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
17820 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17830 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
17840 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
17850 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
17860 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17870 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
17880 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17890 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
178a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
178b0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
178c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
178d0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
178e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
178f0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
17900 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17910 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
17920 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17930 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
17940 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17950 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
17960 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
17970 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
17980 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
17990 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
179a0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
179b0 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
179c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
179d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
179e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
179f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17a00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17a10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
17a20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
17a30 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56  double  STMT N V
17a40 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
17a50 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17a60 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63  _double interfac
17a70 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
17a80 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17a90 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
17aa0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
17ab0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
17ac0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
17ad0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
17ae0 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
17af0 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
17b00 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
17b10 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17b20 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76  bind_double(.  v
17b30 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17b40 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17b50 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17b60 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17b70 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17b80 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17b90 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
17ba0 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 20  .  double value 
17bb0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
17bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
17bd0 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  l;.  int i;.  st
17be0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
17bf0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
17c00 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
17c10 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70  * Name of the sp
17c20 65 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70  ecial floating p
17c30 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  oint value */.  
17c40 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
17c50 55 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65  Upper;   /* Uppe
17c60 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20  r 32 bits */.   
17c70 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c   unsigned int iL
17c80 6f 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72  ower;   /* Lower
17c90 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20   32 bits */.  } 
17ca0 61 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b  aSpecialFp[] = {
17cb0 0a 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20  .    {  "NaN",  
17cc0 20 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20      0x7fffffff, 
17cd0 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
17ce0 20 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20    {  "SNaN",    
17cf0 20 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66   0x7ff7ffff, 0xf
17d00 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
17d10 20 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78    "-NaN",     0x
17d20 66 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66  ffffffff, 0xffff
17d30 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
17d40 2d 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66  -SNaN",    0xfff
17d50 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  7ffff, 0xfffffff
17d60 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e  f },.    {  "+In
17d70 66 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30  f",     0x7ff000
17d80 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
17d90 2c 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c  ,.    {  "-Inf",
17da0 20 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c       0xfff00000,
17db0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
17dc0 20 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c     {  "Epsilon",
17dd0 20 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78    0x00000000, 0x
17de0 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20  00000001 },.    
17df0 7b 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30  {  "-Epsilon", 0
17e00 78 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30  x80000000, 0x000
17e10 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20  00001 },.    {  
17e20 22 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66  "NaN0",     0x7f
17e30 66 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f80000, 0x000000
17e40 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e  00 },.    {  "-N
17e50 61 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30  aN0",    0xfff80
17e60 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
17e70 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
17e80 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
17e90 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17ea0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
17eb0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
17ec0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
17ed0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
17ee0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
17ef0 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
17f00 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17f10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17f20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
17f30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17f40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17f50 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
17f60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17f70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
17f80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17f90 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
17fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17fb0 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65  R;..  /* Interce
17fc0 70 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e  pt the string "N
17fd0 61 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65  aN" and generate
17fe0 20 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72   a NaN value for
17ff0 20 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74   it..  ** All ot
18000 68 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20  her strings are 
18010 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
18020 6f 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46  o Tcl_GetDoubleF
18030 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54  romObj()..  ** T
18040 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
18050 4f 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64  Obj() should und
18060 65 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75  erstand "NaN" bu
18070 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a  t some versions.
18080 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62    ** contain a b
18090 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20  ug..  */.  zVal 
180a0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
180b0 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28  objv[3]);.  for(
180c0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
180d0 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66  pecialFp)/sizeof
180e0 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b  (aSpecialFp[0]);
180f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
18100 74 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70  trcmp(aSpecialFp
18110 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29  [i].zName, zVal)
18120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
18130 69 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20  ite3_uint64 x;. 
18140 20 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61       x = aSpecia
18150 6c 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20  lFp[i].iUpper;. 
18160 20 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20       x <<= 32;. 
18170 20 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69       x |= aSpeci
18180 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a  alFp[i].iLower;.
18190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
181a0 7a 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29  zeof(value)==8 )
181b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
181c0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a  sizeof(x)==8 );.
181d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61        memcpy(&va
181e0 6c 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20  lue, &x, 8);.   
181f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18200 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a    }.  if( i>=siz
18210 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f  eof(aSpecialFp)/
18220 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
18230 70 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20  p[0]) &&.       
18240 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
18250 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18260 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
18270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
18280 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
18290 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
182a0 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
182b0 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
182c0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
182d0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
182e0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
182f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18300 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
18310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18320 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18330 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
18340 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18350 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
18360 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54  e3_bind_null  ST
18370 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  MT N.**.** Test 
18380 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
18390 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  _null interface.
183a0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
183b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
183c0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
183d0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
183e0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
183f0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
18400 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
18410 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  s a NULL to the 
18420 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
18430 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
18440 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a  d_null(.  void *
18450 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18460 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18470 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18480 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18490 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
184a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
184b0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
184c0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
184d0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
184e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
184f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18500 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18510 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
18520 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
18530 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
18540 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20  TMT N", 0);.    
18550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18560 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
18570 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
18580 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18590 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
185a0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
185b0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
185c0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
185d0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
185e0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
185f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
18600 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
18610 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29  null(pStmt, idx)
18620 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
18630 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
18640 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
18650 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
18660 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
18670 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18680 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
18690 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
186a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
186b0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
186c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
186d0 78 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e  xt  STMT N STRIN
186e0 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  G BYTES.**.** Te
186f0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
18700 69 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61  ind_text interfa
18710 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
18720 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18730 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
18740 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
18750 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
18760 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
18770 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
18780 69 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72  inds a UTF-8 str
18790 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68  ing STRING to th
187a0 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
187b0 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53   string is BYTES
187c0 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a   bytes.** long..
187d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
187e0 73 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20  st_bind_text(.  
187f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18800 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18810 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18820 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18830 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18840 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18850 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
18860 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
18870 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
18880 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
18890 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
188a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
188b0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
188c0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
188d0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
188e0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
188f0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
18900 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59   STMT N VALUE BY
18910 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
18920 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18930 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
18940 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
18950 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18960 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
18970 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18980 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
18990 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
189a0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
189b0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
189c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
189d0 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65   = (char*)Tcl_Ge
189e0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
189f0 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  j(objv[3], &byte
18a00 73 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  s);.  if( Tcl_Ge
18a10 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18a20 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
18a30 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
18a40 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
18a50 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
18a60 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  xt(pStmt, idx, v
18a70 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c  alue, bytes, SQL
18a80 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
18a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
18aa0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
18ab0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
18ac0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
18ad0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
18ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18af0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18b00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
18b10 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
18b20 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18b40 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18b60 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
18b70 5f 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63  _text16 ?-static
18b80 3f 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20  ? STMT N STRING 
18b90 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
18ba0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
18bb0 64 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61  d_text16 interfa
18bc0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
18bd0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18be0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
18bf0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
18c00 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
18c10 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
18c20 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
18c30 69 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74  inds a UTF-16 st
18c40 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74  ring STRING to t
18c50 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
18c60 65 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45  e string is BYTE
18c70 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e  S bytes.** long.
18c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18c90 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  est_bind_text16(
18ca0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18cb0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18cc0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18cd0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18ce0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18cf0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
18d00 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
18d10 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18d20 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
18d30 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
18d40 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
18d50 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78   rc;..  void (*x
18d60 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f  Del)(void*) = (o
18d70 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54  bjc==6?SQLITE_ST
18d80 41 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e  ATIC:SQLITE_TRAN
18d90 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62  SIENT);.  Tcl_Ob
18da0 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62  j *oStmt    = ob
18db0 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63  jv[objc-4];.  Tc
18dc0 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20  l_Obj *oN       
18dd0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a  = objv[objc-3];.
18de0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69    Tcl_Obj *oStri
18df0 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ng  = objv[objc-
18e00 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  2];.  Tcl_Obj *o
18e10 42 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f  Bytes   = objv[o
18e20 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f  bjc-1];..  if( o
18e30 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
18e40 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  6){.    Tcl_Appe
18e50 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18e60 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18e70 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
18e80 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18e90 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
18ea0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
18eb0 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20  N VALUE BYTES", 
18ec0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
18ed0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18ee0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
18ef0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
18f00 47 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29  GetString(oStmt)
18f10 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18f20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18f30 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18f40 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e  omObj(interp, oN
18f50 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
18f60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
18f70 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c  lue = (char*)Tcl
18f80 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
18f90 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29  mObj(oString, 0)
18fa0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
18fb0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
18fc0 2c 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73  , oBytes, &bytes
18fd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18fe0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
18ff0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
19000 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76  6(pStmt, idx, (v
19010 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74  oid *)value, byt
19020 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28  es, xDel);.  if(
19030 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
19040 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
19050 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
19060 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19070 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
19080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19090 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
190a0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
190b0 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
190c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
190d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64  ERROR;.  }..#end
190e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
190f0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
19100 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19110 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
19120 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
19130 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
19140 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a   DATA BYTES.**.*
19150 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
19160 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74  e3_bind_blob int
19170 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
19180 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
19190 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
191a0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
191b0 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
191c0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
191d0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
191e0 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20  ** binds a BLOB 
191f0 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
19200 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59    The BLOB is BY
19210 54 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a  TES bytes in siz
19220 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19230 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28   test_bind_blob(
19240 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19250 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19260 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19270 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19280 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19290 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
192a0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
192b0 6c 65 6e 2c 20 69 64 78 3b 0a 20 20 69 6e 74 20  len, idx;.  int 
192c0 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
192d0 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
192e0 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75    sqlite3_destru
192f0 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74 72  ctor_type xDestr
19300 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 54  uctor = SQLITE_T
19310 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66 28  RANSIENT;..  if(
19320 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
19330 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=6 ){.    Tcl_A
19340 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19350 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19360 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19370 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
19380 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
19390 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
193a0 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 22  MT N DATA BYTES"
193b0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
193c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
193d0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29  .  if( objc==6 )
193e0 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63 74 6f  {.    xDestructo
193f0 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 49  r = SQLITE_STATI
19400 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20  C;.    objv++;. 
19410 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
19420 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
19430 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19440 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
19450 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19460 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
19470 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19480 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
19490 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
194a0 5f 45 52 52 4f 52 3b 0a 0a 20 20 76 61 6c 75 65  _ERROR;..  value
194b0 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65   = (char*)Tcl_Ge
194c0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
194d0 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29  j(objv[3], &len)
194e0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
194f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
19500 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65  , objv[4], &byte
19510 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
19520 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 62 79  ERROR;..  if( by
19530 74 65 73 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 63  tes>len ){.    c
19540 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
19550 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
19560 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
19570 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
19590 6e 6e 6f 74 20 75 73 65 20 25 64 20 62 6c 6f 62  nnot use %d blob
195a0 20 62 79 74 65 73 2c 20 68 61 76 65 20 25 64 22   bytes, have %d"
195b0 2c 20 62 79 74 65 73 2c 20 6c 65 6e 29 3b 0a 20  , bytes, len);. 
195c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
195d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
195e0 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
195f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19600 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
19610 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
19620 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79  , idx, value, by
19630 74 65 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72  tes, xDestructor
19640 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
19650 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
19660 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
19670 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
19680 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
19690 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
196a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
196b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
196c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
196d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
196e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
196f0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20  arameter_count  
19700 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
19710 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19720 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65  wildcards in the
19730 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74   given statement
19740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19750 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
19760 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ter_count(.  voi
19770 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
19780 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19790 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
197a0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
197b0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
197c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
197d0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
197e0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
197f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
19800 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
19810 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
19820 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
19830 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19840 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19850 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19860 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19870 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19880 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
19890 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
198a0 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
198b0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
198c0 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
198d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
198e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
198f0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
19900 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20  parameter_name  
19910 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65  STMT  N.**.** Re
19920 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
19930 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72   the Nth wildcar
19940 64 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69  d.  The first wi
19950 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20  ldcard is 1..** 
19960 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  An empty string 
19970 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e  is returned if N
19980 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
19990 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63   or if the wildc
199a0 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65  ard.** is namele
199b0 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
199c0 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
199d0 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f  meter_name(.  vo
199e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
199f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
19a00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
19a10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
19a20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
19a30 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
19a40 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tmt;.  int i;.. 
19a50 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
19a60 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
19a70 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
19a80 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b  objv, "STMT N");
19a90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19aa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19ab0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
19ac0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19ad0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19ae0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
19af0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19b00 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
19b10 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
19b20 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72  [2], &i) ) retur
19b30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
19b40 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
19b50 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
19b60 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
19b70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
19b80 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
19b90 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72  ,i),-1).  );.  r
19ba0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19bb0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
19bc0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
19bd0 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54  ameter_index  ST
19be0 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  MT  NAME.**.** R
19bf0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
19c00 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  of the wildcard 
19c10 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65  called NAME.  Re
19c20 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
19c30 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69  is.** no such wi
19c40 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
19c50 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
19c60 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
19c70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19c80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19c90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19ca0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19cb0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19cc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
19cd0 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
19ce0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
19cf0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
19d00 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
19d10 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a  , "STMT NAME");.
19d20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19d30 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
19d40 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
19d50 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
19d60 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
19d70 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
19d80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
19d90 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
19da0 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f  terp, .     Tcl_
19db0 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20  NewIntObj(.     
19dc0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
19dd0 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70  arameter_index(p
19de0 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72 69  Stmt,Tcl_GetStri
19df0 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20  ng(objv[2])).   
19e00 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72    ).  );.  retur
19e10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
19e20 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
19e30 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
19e40 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74  gs STMT.**.*/.st
19e50 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c  atic int test_cl
19e60 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20  ear_bindings(.  
19e70 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
19e80 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
19e90 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19ea0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19eb0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19ec0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19ed0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
19ee0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
19ef0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
19f00 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
19f10 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
19f20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19f30 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
19f40 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
19f50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19f60 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
19f70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19f80 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
19f90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
19fa0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
19fb0 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
19fc0 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  gs(pStmt)));.  r
19fd0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19fe0 0a 2f 2a 0a 20 2a 2a 20 55 73 61 67 65 3a 20 20  ./*. ** Usage:  
19ff0 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62   sqlite3_clear_b
1a000 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 20 2a 2a  indings STMT. **
1a010 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1a020 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
1a030 6e 67 73 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64  ngs_null(.  void
1a040 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1a050 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a060 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1a070 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1a080 54 20 6f 62 6a 76 5b 5d 0a 29 7b 20 20 0a 20 20  T objv[].){  .  
1a090 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
1a0a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a0b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 2f 2a 20 74 65  ROR;.  }.  /* te
1a0c0 73 74 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  st for handling 
1a0d0 4e 55 4c 4c 20 3c 72 64 61 72 3a 2f 2f 70 72 6f  NULL <rdar://pro
1a0e0 62 6c 65 6d 2f 36 36 34 36 33 33 31 3e 20 2a 2f  blem/6646331> */
1a0f0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1a100 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1a110 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
1a120 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  3_clear_bindings
1a130 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (0)));.  return 
1a140 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1a150 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
1a160 33 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43  3_sleep MILLISEC
1a170 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONDS.*/.static i
1a180 6e 74 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20  nt test_sleep(. 
1a190 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1a1a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1a1b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a1c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1a1d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1a1e0 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66  .  int ms;..  if
1a1f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1a200 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1a210 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1a220 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  v, "MILLISECONDS
1a230 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1a240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a250 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1a260 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1a270 6a 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20  jv[1], &ms) ){. 
1a280 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a290 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  ROR;.  }.  Tcl_S
1a2a0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1a2b0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1a2c0 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  j(sqlite3_sleep(
1a2d0 6d 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ms)));.  return 
1a2e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1a2f0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1a300 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
1a310 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
1a320 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
1a330 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1a340 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
1a350 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65  lite3_* API.** e
1a360 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20  rror code. e.g. 
1a370 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a  "SQLITE_ERROR"..
1a380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1a390 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20  st_ex_errcode(. 
1a3a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1a3b0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1a3c0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a3d0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1a3e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1a3f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1a400 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1a410 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1a420 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a430 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a440 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a450 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a460 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a470 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
1a480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a490 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1a4a0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1a4b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1a4c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1a4d0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1a4e0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1a4f0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1a500 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54  errcode(db);.  T
1a510 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a520 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1a530 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1a540 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1a550 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1a560 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
1a570 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20  rrcode DB.**.** 
1a580 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e  Return the strin
1a590 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
1a5a0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
1a5b0 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
1a5c0 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e  I.** error code.
1a5d0 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52   e.g. "SQLITE_ER
1a5e0 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ROR"..*/.static 
1a5f0 69 6e 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65  int test_errcode
1a600 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a610 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a620 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a630 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1a640 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1a650 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1a660 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
1a670 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1a680 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a690 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a6a0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a6b0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1a6c0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1a6d0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
1a6e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a6f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a700 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a710 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a720 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a730 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1a740 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1a750 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
1a760 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70  e(db);.  Tcl_App
1a770 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a780 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1a790 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
1a7a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a7b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1a7c0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
1a7d0 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
1a7e0 73 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72  s the UTF-8 repr
1a7f0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1a800 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
1a810 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a  string for the.*
1a820 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  * most recent sq
1a830 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c  lite3_* API call
1a840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a850 74 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76  test_errmsg(.  v
1a860 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1a870 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1a880 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1a890 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1a8a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1a8b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1a8c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
1a8d0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1a8e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1a8f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a900 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1a910 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1a920 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1a930 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1a940 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1a950 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a960 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1a970 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1a980 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a990 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
1a9a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a9b0 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
1a9c0 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20  3_errmsg(db);.  
1a9d0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1a9e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1a9f0 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20  StringObj(zErr, 
1aa00 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
1aa10 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1aa20 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72  Usage:   test_er
1aa30 72 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20  rmsg16 DB.**.** 
1aa40 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d  Returns the UTF-
1aa50 31 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  16 representatio
1aa60 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
1aa70 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
1aa80 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
1aa90 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
1aaa0 50 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73  PI call. This is
1aab0 20 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62   a byte array ob
1aac0 6a 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20  ject at the TCL 
1aad0 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69  .** level, and i
1aae0 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30  t includes the 0
1aaf0 78 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61  x00 0x00 termina
1ab00 74 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65  tor bytes at the
1ab10 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55   end of the.** U
1ab20 54 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f  TF-16 string..*/
1ab30 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1ab40 5f 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69  _errmsg16(.  voi
1ab50 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1ab60 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1ab70 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1ab80 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1ab90 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1aba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1abb0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
1abc0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
1abd0 69 64 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73  id *zErr;.  cons
1abe0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
1abf0 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69   bytes = 0;..  i
1ac00 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1ac10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ac20 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1ac30 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1ac40 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1ac50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ac60 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
1ac70 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ac80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1ac90 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1aca0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1acb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1acc0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1acd0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72  CL_ERROR;..  zEr
1ace0 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
1acf0 73 67 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20  sg16(db);.  if( 
1ad00 7a 45 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20  zErr ){.    z = 
1ad10 7a 45 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79  zErr;.    for(by
1ad20 74 65 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20  tes=0; z[bytes] 
1ad30 7c 7c 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62  || z[bytes+1]; b
1ad40 79 74 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20  ytes+=2){}.  }. 
1ad50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1ad60 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1ad70 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45  wByteArrayObj(zE
1ad80 72 72 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e  rr, bytes));.#en
1ad90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1ada0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1adb0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1adc0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1add0 69 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20  ite3_prepare DB 
1ade0 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76  sql bytes ?tailv
1adf0 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  ar?.**.** Compil
1ae00 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1ae10 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1ae20 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1ae30 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1ae40 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1ae50 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1ae60 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1ae70 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1ae80 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1ae90 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1aea0 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1aeb0 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1aec0 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1aed0 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1aee0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1aef0 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 28  nt test_prepare(
1af00 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1af10 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1af20 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1af30 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1af40 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1af50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1af60 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1af70 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65  zSql;.  int byte
1af80 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s;.  const char 
1af90 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *zTail = 0;.  sq
1afa0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1afb0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1afc0 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63  uf[50];.  int rc
1afd0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
1afe0 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
1aff0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b000 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1b010 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1b020 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1b030 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1b040 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
1b050 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1b060 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  r?", 0);.    ret
1b070 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b080 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1b090 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1b0a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b0b0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1b0c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b0d0 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zSql = Tcl_GetS
1b0e0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
1b0f0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b100 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1b110 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1b120 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b130 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1b140 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
1b150 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
1b160 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
1b170 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54  &zTail : 0);.  T
1b180 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1b190 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71  nterp);.  if( sq
1b1a0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1b1b0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1b1c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b1d0 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c  ROR;.  if( zTail
1b1e0 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20   && objc>=5 ){. 
1b1f0 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
1b200 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
1b210 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a   bytes - (int)(z
1b220 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20  Tail-zSql);.    
1b230 7d 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 73  }.    if( (int)s
1b240 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74  trlen(zTail)<byt
1b250 65 73 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  es ){.      byte
1b260 73 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  s = (int)strlen(
1b270 7a 54 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zTail);.    }.  
1b280 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1b290 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1b2a0 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  , 0, Tcl_NewStri
1b2b0 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74  ngObj(zTail, byt
1b2c0 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  es), 0);.  }.  i
1b2d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b2e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b2f0 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1b300 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1b310 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
1b320 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
1b330 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
1b340 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1b350 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
1b360 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
1b370 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b380 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
1b390 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1b3a0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1b3b0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1b3c0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1b3d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b3e0 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
1b3f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1b400 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
1b410 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1b420 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1b430 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1b440 32 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  2 DB sql bytes ?
1b450 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43  tailvar?.**.** C
1b460 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
1b470 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
1b480 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
1b490 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
1b4a0 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
1b4b0 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
1b4c0 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
1b4d0 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
1b4e0 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
1b4f0 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
1b500 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
1b510 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
1b520 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
1b530 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
1b540 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1b550 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
1b560 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  pare_v2(.  void 
1b570 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1b580 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b590 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1b5a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b5b0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1b5c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1b5d0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
1b5e0 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30 3b  char *zCopy = 0;
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 63 6f 70 79  /* malloc() copy
1b610 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e   of zSql */.  in
1b620 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
1b630 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
1b640 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1b650 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1b660 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
1b670 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
1b680 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1b690 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1b6a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b6b0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1b6c0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1b6d0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1b6e0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1b6f0 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
1b700 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
1b710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b720 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1b730 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1b740 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b750 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1b760 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b770 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
1b780 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
1b790 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
1b7a0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1b7b0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
1b7c0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
1b7d0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49  L_ERROR;..  /* I
1b7e0 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20  nstead of using 
1b7f0 7a 53 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d  zSql directly, m
1b800 61 6b 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20  ake a copy into 
1b810 61 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65  a buffer obtaine
1b820 64 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20  d.  ** directly 
1b830 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54  from malloc(). T
1b840 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61  he idea is to ma
1b850 6b 65 20 69 74 20 65 61 73 69 65 72 20 66 6f 72  ke it easier for
1b860 20 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74   valgrind.  ** t
1b870 6f 20 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76  o spot buffer ov
1b880 65 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69  erreads.  */.  i
1b890 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
1b8a0 20 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f     zCopy = mallo
1b8b0 63 28 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65  c(bytes);.    me
1b8c0 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
1b8d0 2c 20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73  , bytes);.  }els
1b8e0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28  e{.    int n = (
1b8f0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29  int)strlen(zSql)
1b900 20 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20   + 1;.    zCopy 
1b910 3d 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20  = malloc(n);.   
1b920 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
1b930 53 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72  Sql, n);.  }.  r
1b940 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1b950 61 72 65 5f 76 32 28 64 62 2c 20 7a 43 6f 70 79  are_v2(db, zCopy
1b960 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1b970 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1b980 6c 20 3a 20 30 29 3b 0a 20 20 66 72 65 65 28 7a  l : 0);.  free(z
1b990 43 6f 70 79 29 3b 0a 20 20 7a 54 61 69 6c 20 3d  Copy);.  zTail =
1b9a0 20 26 7a 53 71 6c 5b 28 7a 54 61 69 6c 20 2d 20   &zSql[(zTail - 
1b9b0 7a 43 6f 70 79 29 5d 3b 0a 0a 20 20 61 73 73 65  zCopy)];..  asse
1b9c0 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
1b9d0 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20   || pStmt==0);. 
1b9e0 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
1b9f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  (interp);.  if( 
1ba00 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1ba10 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1ba20 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1ba30 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d  ERROR;.  if( rc=
1ba40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 54  =SQLITE_OK && zT
1ba50 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29  ail && objc>=5 )
1ba60 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e  {.    if( bytes>
1ba70 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  =0 ){.      byte
1ba80 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74  s = bytes - (int
1ba90 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20  )(zTail-zSql);. 
1baa0 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
1bab0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1bac0 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
1bad0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
1bae0 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
1baf0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1bb00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1bb10 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
1bb20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1bb30 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
1bb40 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64  Buf), zBuf, "(%d
1bb50 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
1bb60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bb70 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
1bb80 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
1bb90 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1bba0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1bbb0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1bbc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1bbd0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1bbe0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1bbf0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1bc00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
1bc10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bc20 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1bc30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1bc40 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1bc50 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
1bc60 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42  epare_tkt3134 DB
1bc70 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
1bc80 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
1bc90 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d  ment for a zero-
1bca0 62 79 74 65 20 73 74 72 69 6e 67 20 61 73 20 61  byte string as a
1bcb0 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63   test.** for tic
1bcc0 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68 65 20  ket #3134.  The 
1bcd0 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65  string should be
1bce0 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 7a   preceded by a z
1bcf0 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  ero byte..*/.sta
1bd00 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
1bd10 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20  pare_tkt3134(.  
1bd20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1bd30 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1bd40 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1bd50 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1bd60 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1bd70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1bd80 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1bd90 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30  ar zSql[] = "\00
1bda0 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71  0SELECT 1";.  sq
1bdb0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1bdc0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1bdd0 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63  uf[50];.  int rc
1bde0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1bdf0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1be00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1be10 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1be20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1be30 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1be40 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1be50 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
1be60 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
1be70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1be80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1be90 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1bea0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1beb0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1bec0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bed0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1bee0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
1bef0 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53  &zSql[1], 0, &pS
1bf00 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  tmt, 0);.  asser
1bf10 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
1bf20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20  || pStmt==0);.  
1bf30 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1bf40 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
1bf50 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
1bf60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1bf70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bf80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1bf90 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tmt==0 );.    sq
1bfa0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1bfb0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
1bfc0 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1bfd0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1bfe0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1bff0 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1c000 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1c010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c020 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1c030 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1c040 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1c050 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1c060 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1c070 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c080 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c090 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1c0a0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1c0b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c0c0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c0d0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44  ite3_prepare16 D
1c0e0 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
1c0f0 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
1c100 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1c110 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1c120 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1c130 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1c140 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1c150 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1c160 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1c170 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1c180 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1c190 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1c1a0 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1c1b0 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1c1c0 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1c1d0 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1c1e0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1c1f0 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31  nt test_prepare1
1c200 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1c210 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1c220 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1c230 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1c240 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1c250 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1c260 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1c270 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1c280 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
1c290 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1c2a0 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
1c2b0 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
1c2c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1c2d0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1c2e0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
1c2f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
1c300 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
1c310 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
1c320 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
1c330 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
1c340 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
1c350 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
1c360 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
1c370 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
1c380 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
1c390 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1c3a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c3b0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1c3c0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1c3d0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1c3e0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1c3f0 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1c400 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
1c410 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c420 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1c430 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1c440 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1c450 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1c460 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1c470 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
1c480 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1c490 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
1c4a0 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
1c4b0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1c4c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1c4d0 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1c4e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c4f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1c500 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53  prepare16(db, zS
1c510 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
1c520 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
1c530 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ail : 0);.  if( 
1c540 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1c550 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1c560 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1c570 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
1c580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1c590 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c5a0 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20  if( objc>=5 ){. 
1c5b0 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a     if( zTail ){.
1c5c0 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f        objlen = o
1c5d0 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75  bjlen - (int)((u
1c5e0 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29  8 *)zTail-(u8 *)
1c5f0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
1c600 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1c610 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   0;.    }.    pT
1c620 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
1c630 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
1c640 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
1c650 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1c660 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20  ount(pTail);.   
1c670 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1c680 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1c690 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
1c6a0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1c6b0 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a  unt(pTail);.  }.
1c6c0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
1c6d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
1c6e0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1c6f0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1c700 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1c710 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1c720 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c730 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1c740 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
1c750 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1c760 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1c770 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1c780 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1c790 61 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20  are16_v2 DB sql 
1c7a0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
1c7b0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1c7c0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1c7d0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1c7e0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1c7f0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1c800 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1c810 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1c820 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1c830 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1c840 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1c850 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1c860 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1c870 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1c880 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1c890 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1c8a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1c8b0 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
1c8c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c8d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c8e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c8f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c900 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c910 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1c920 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1c930 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1c940 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
1c950 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1c960 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
1c970 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
1c980 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c990 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1c9a0 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
1c9b0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
1c9c0 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1c9d0 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1c9e0 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
1c9f0 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
1ca00 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
1ca10 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
1ca20 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
1ca30 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
1ca40 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1ca50 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1ca60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ca70 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ca80 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1ca90 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1caa0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1cab0 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1cac0 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
1cad0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1cae0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1caf0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1cb00 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1cb10 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1cb20 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1cb30 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1cb40 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1cb50 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
1cb60 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
1cb70 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1cb80 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1cb90 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1cba0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1cbb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1cbc0 72 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20  repare16_v2(db, 
1cbd0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1cbe0 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1cbf0 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66  zTail : 0);.  if
1cc00 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1cc10 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1cc20 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1cc30 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1cc40 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1cc50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1cc60 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b    if( objc>=5 ){
1cc70 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29  .    if( zTail )
1cc80 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1cc90 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28   objlen - (int)(
1cca0 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20  (u8 *)zTail-(u8 
1ccb0 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  *)zSql);.    }el
1ccc0 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e  se{.      objlen
1ccd0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1cce0 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42  pTail = Tcl_NewB
1ccf0 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20  yteArrayObj((u8 
1cd00 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29  *)zTail, objlen)
1cd10 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
1cd20 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1cd30 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
1cd40 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
1cd50 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
1cd60 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1cd70 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1cd80 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1cd90 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1cda0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1cdb0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1cdc0 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1cdd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1cde0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1cdf0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1ce00 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
1ce10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1ce20 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1ce30 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ce40 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70  sage: sqlite3_op
1ce50 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74  en filename ?opt
1ce60 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74  ions-list?.*/.st
1ce70 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70  atic int test_op
1ce80 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  en(.  void * cli
1ce90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1cea0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ceb0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1cec0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ced0 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
1cee0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
1cef0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1cf00 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1cf10 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
1cf20 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  & objc!=2 && obj
1cf30 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1cf40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1cf50 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1cf60 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1cf70 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1cf80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1cf90 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
1cfa0 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
1cfb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1cfc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
1cfd0 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31  ilename = objc>1
1cfe0 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   ? Tcl_GetString
1cff0 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20  (objv[1]) : 0;. 
1d000 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
1d010 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
1d020 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
1d030 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1d040 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1d050 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1d060 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
1d070 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d080 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
1d090 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d0a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1d0b0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49  lite3_open_v2 FI
1d0c0 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53  LENAME FLAGS VFS
1d0d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1d0e0 65 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76  est_open_v2(.  v
1d0f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1d100 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1d110 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1d120 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1d130 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1d140 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1d150 6c 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20  lename;.  const 
1d160 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e  char *zVfs;.  in
1d170 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73  t flags = 0;.  s
1d180 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1d190 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75  t rc;.  char zBu
1d1a0 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e  f[100];..  int n
1d1b0 46 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  Flag;.  Tcl_Obj 
1d1c0 2a 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20  **apFlag;.  int 
1d1d0 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  i;..  if( objc!=
1d1e0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
1d1f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1d200 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45  , 1, objv, "FILE
1d210 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 22 29  NAME FLAGS VFS")
1d220 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d230 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46  _ERROR;.  }.  zF
1d240 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
1d250 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1d260 3b 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47  ;.  zVfs = Tcl_G
1d270 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
1d280 29 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b 30 5d  );.  if( zVfs[0]
1d290 3d 3d 30 78 30 30 20 29 20 7a 56 66 73 20 3d 20  ==0x00 ) zVfs = 
1d2a0 30 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c  0;..  rc = Tcl_L
1d2b0 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
1d2c0 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  s(interp, objv[2
1d2d0 5d 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c  ], &nFlag, &apFl
1d2e0 61 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ag);.  if( rc!=T
1d2f0 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  CL_OK ) return r
1d300 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
1d310 6e 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFlag; i++){.   
1d320 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20 20   int iFlag;.    
1d330 73 74 72 75 63 74 20 4f 70 65 6e 46 6c 61 67 20  struct OpenFlag 
1d340 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1d350 61 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20  ar *zFlag;.     
1d360 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d   int flag;.    }
1d370 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20   aFlag[] = {.   
1d380 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1d390 4e 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c  N_READONLY", SQL
1d3a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1d3b0 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  Y },.      { "SQ
1d3c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1d3d0 49 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE", SQLITE_OPE
1d3e0 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 0a 20  N_READWRITE },. 
1d3f0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1d400 50 45 4e 5f 43 52 45 41 54 45 22 2c 20 53 51 4c  PEN_CREATE", SQL
1d410 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
1d420 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1d430 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1d440 43 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f  CLOSE", SQLITE_O
1d450 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1d460 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1d470 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1d480 49 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE", SQLITE_OPE
1d490 4e 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20  N_EXCLUSIVE },. 
1d4a0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1d4b0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20  PEN_AUTOPROXY", 
1d4c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
1d4d0 50 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b  PROXY },.      {
1d4e0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   "SQLITE_OPEN_MA
1d4f0 49 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f  IN_DB", SQLITE_O
1d500 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20  PEN_MAIN_DB },. 
1d510 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1d520 50 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51  PEN_TEMP_DB", SQ
1d530 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
1d540 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  B },.      { "SQ
1d550 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1d560 45 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f  ENT_DB", SQLITE_
1d570 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
1d580 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  B },.      { "SQ
1d590 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1d5a0 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f  OURNAL", SQLITE_
1d5b0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1d5c0 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  L },.      { "SQ
1d5d0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
1d5e0 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f  OURNAL", SQLITE_
1d5f0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
1d600 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  L },.      { "SQ
1d610 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
1d620 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RNAL", SQLITE_OP
1d630 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c  EN_SUBJOURNAL },
1d640 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1d650 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
1d660 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RNAL", SQLITE_OP
1d670 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1d680 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  L },.      { "SQ
1d690 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
1d6a0 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  X", SQLITE_OPEN_
1d6b0 4e 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20  NOMUTEX },.     
1d6c0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1d6d0 46 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49  FULLMUTEX", SQLI
1d6e0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
1d6f0 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  X },.      { "SQ
1d700 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
1d710 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f  CACHE", SQLITE_O
1d720 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
1d730 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1d740 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
1d750 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ACHE", SQLITE_OP
1d760 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
1d770 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1d780 54 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51  TE_OPEN_WAL", SQ
1d790 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c  LITE_OPEN_WAL },
1d7a0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1d7b0 5f 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49  _OPEN_URI", SQLI
1d7c0 54 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20  TE_OPEN_URI },. 
1d7d0 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
1d7e0 20 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63    };.    rc = Tc
1d7f0 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
1d800 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20  jStruct(interp, 
1d810 61 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67  apFlag[i], aFlag
1d820 2c 20 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30  , sizeof(aFlag[0
1d830 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22 66 6c  ]), .        "fl
1d840 61 67 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20  ag", 0, &iFlag. 
1d850 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
1d860 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72  !=TCL_OK ) retur
1d870 6e 20 72 63 3b 0a 20 20 20 20 66 6c 61 67 73 20  n rc;.    flags 
1d880 7c 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e  |= aFlag[iFlag].
1d890 66 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  flag;.  }..  rc 
1d8a0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
1d8b0 32 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  2(zFilename, &db
1d8c0 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  , flags, zVfs);.
1d8d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1d8e0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1d8f0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
1d900 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d910 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
1d920 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d930 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
1d940 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1d950 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1d960 74 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e  te3_open16 filen
1d970 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73  ame options.*/.s
1d980 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f  tatic int test_o
1d990 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  pen16(.  void * 
1d9a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1d9b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d9c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1d9d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1d9e0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1d9f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1da00 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  16.  const void 
1da10 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
1da20 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
1da30 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1da40 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1da50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1da60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1da70 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1da80 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1da90 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1daa0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
1dab0 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
1dac0 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
1dad0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dae0 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
1daf0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1db00 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
1db10 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
1db20 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65  open16(zFilename
1db30 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28  , &db);.  .  if(
1db40 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1db50 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1db60 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
1db70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1db80 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1db90 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1dba0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
1dbb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1dbc0 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1dbd0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1dbe0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1dbf0 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36  mplete16 <UTF-16
1dc00 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52   string>.**.** R
1dc10 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 73  eturn 1 if the s
1dc20 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74  upplied argument
1dc30 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53   is a complete S
1dc40 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72  QL statement, or
1dc50 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69   zero.** otherwi
1dc60 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1dc70 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31  t test_complete1
1dc80 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1dc90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1dca0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1dcb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1dcc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1dcd0 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  ].){.#if !define
1dce0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
1dcf0 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65 66 69  MPLETE) && !defi
1dd00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1dd10 55 54 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a  UTF16).  char *z
1dd20 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Buf;..  if( objc
1dd30 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1dd40 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1dd50 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75  rp, 1, objv, "<u
1dd60 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20  tf-16 sql>");.  
1dd70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1dd80 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20  OR;.  }..  zBuf 
1dd90 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
1dda0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
1ddb0 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
1ddc0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1ddd0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1dde0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
1ddf0 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29  omplete16(zBuf))
1de00 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1de10 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
1de20 45 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54  E && SQLITE_OMIT
1de30 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1de40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1de50 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1de60 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a  e3_step STMT.**.
1de70 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73  ** Advance the s
1de80 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
1de90 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  next row..*/.sta
1dea0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65  tic int test_ste
1deb0 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
1dec0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1ded0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1dee0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1def0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1df00 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1df10 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1df20 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1df30 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1df40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1df50 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1df60 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1df70 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1df80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1df90 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a  ), " STMT", 0);.
1dfa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1dfb0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1dfc0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1dfd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1dfe0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1dff0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1e000 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1e010 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1e020 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66  pStmt);..  /* if
1e030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
1e040 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  E && rc!=SQLITE_
1e050 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ROW ) return TCL
1e060 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c  _ERROR; */.  Tcl
1e070 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1e080 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1e090 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1e0a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e0b0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
1e0c0 65 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20  est_sql(.  void 
1e0d0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1e0e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1e0f0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1e100 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1e110 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1e120 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1e130 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1e140 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1e150 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1e160 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22   1, objv, "STMT"
1e170 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e180 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1e190 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1e1a0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1e1b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1e1c0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1e1d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e1e0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1e1f0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
1e200 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
1e210 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
1e220 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1e230 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
1e240 74 65 73 74 5f 65 78 5f 73 71 6c 28 0a 20 20 76  test_ex_sql(.  v
1e250 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1e260 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1e270 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1e280 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1e290 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1e2a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1e2b0 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  Stmt;.  char *z;
1e2c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1e2d0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1e2e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1e2f0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
1e300 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1e310 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1e320 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1e330 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1e340 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1e350 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1e360 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e370 7a 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 61  z = sqlite3_expa
1e380 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b  nded_sql(pStmt);
1e390 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1e3a0 28 69 6e 74 65 72 70 2c 20 7a 2c 20 54 43 4c 5f  (interp, z, TCL_
1e3b0 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 73 71 6c  VOLATILE);.  sql
1e3c0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
1e3d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e3e0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1e3f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
1e400 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  unt STMT .**.** 
1e410 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1e420 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
1e430 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
1e440 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e   statement STMT.
1e450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1e460 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
1e470 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e480 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1e490 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e4a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1e4b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e4c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1e4d0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
1e4e0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1e4f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e500 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1e510 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e520 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1e530 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1e540 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1e550 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1e560 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e570 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1e580 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1e590 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1e5a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1e5b0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1e5c0 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
1e5d0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1e5e0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1e5f0 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
1e600 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
1e610 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1e630 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1e640 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _type STMT colum
1e650 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1e660 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64  he type of the d
1e670 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
1e680 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
1e690 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74  rrent row..*/.st
1e6a0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1e6b0 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69  lumn_type(.  voi
1e6c0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1e6d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1e6e0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1e6f0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1e700 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1e710 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1e720 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1e730 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20   int tp;..  if( 
1e740 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1e750 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e760 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1e770 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1e780 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1e790 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1e7a0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1e7b0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1e7c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e7d0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1e7e0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1e7f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1e800 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1e810 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e820 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1e830 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1e840 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1e850 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1e860 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d  L_ERROR;..  tp =
1e870 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e880 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  type(pStmt, col)
1e890 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29  ;.  switch( tp )
1e8a0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1e8b0 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20  E_INTEGER: .    
1e8c0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1e8d0 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52  interp, "INTEGER
1e8e0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1e8f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e900 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
1e910 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  LL:.      Tcl_Se
1e920 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1e930 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54  "NULL", TCL_STAT
1e940 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1e950 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1e960 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20  TE_FLOAT:.      
1e970 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1e980 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54  terp, "FLOAT", T
1e990 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1e9a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1e9b0 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a  se SQLITE_TEXT:.
1e9c0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1e9d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58  ult(interp, "TEX
1e9e0 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  T", TCL_STATIC);
1e9f0 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1ea00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
1ea10 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  LOB:.      Tcl_S
1ea20 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1ea30 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41   "BLOB", TCL_STA
1ea40 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1ea50 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1ea60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
1ea70 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1ea80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1ea90 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1eaa0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d  column_int64 STM
1eab0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
1eac0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
1ead0 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1eae0 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1eaf0 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a   row cast as an.
1eb00 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29  ** wide (64-bit)
1eb10 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
1eb20 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1eb30 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69  umn_int64(.  voi
1eb40 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1eb50 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1eb60 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1eb70 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1eb80 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1eb90 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1eba0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1ebb0 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66   i64 iVal;..  if
1ebc0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1ebd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ebe0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1ebf0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1ec00 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1ec10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ec20 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1ec30 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1ec40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ec50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1ec60 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1ec70 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1ec80 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1ec90 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1eca0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1ecb0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1ecc0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1ecd0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1ece0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56  TCL_ERROR;..  iV
1ecf0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
1ed00 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1ed10 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1ed20 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1ed30 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
1ed40 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(iVal));.  re
1ed50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ed60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1ed70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1ed80 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1ed90 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1eda0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76  column_blob(.  v
1edb0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1edc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1edd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1ede0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1edf0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1ee00 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1ee10 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1ee20 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63  ..  int len;.  c
1ee30 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
1ee40 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1ee50 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1ee60 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ee70 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ee80 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1ee90 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1eea0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1eeb0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1eec0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1eed0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1eee0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1eef0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1ef00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1ef10 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1ef20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ef30 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1ef40 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1ef50 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1ef60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ef70 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
1ef80 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1ef90 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70  pStmt, col);.  p
1efa0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
1efb0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
1efc0 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1efd0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1efe0 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
1eff0 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65  rayObj(pBlob, le
1f000 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
1f010 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f020 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1f030 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54  lumn_double STMT
1f040 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1f050 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
1f060 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1f070 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1f080 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f  row cast as a do
1f090 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
1f0a0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1f0b0 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
1f0c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1f0d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f0e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1f0f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1f100 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1f110 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1f120 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f  .  int col;.  do
1f130 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66  uble rVal;..  if
1f140 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1f150 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1f160 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1f170 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1f180 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1f190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1f1a0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1f1b0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1f1c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f1d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1f1e0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1f1f0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1f200 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1f210 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1f220 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1f230 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1f240 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1f250 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1f260 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56  TCL_ERROR;..  rV
1f270 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
1f280 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
1f290 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1f2a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1f2b0 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65  p, Tcl_NewDouble
1f2c0 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(rVal));.  re
1f2d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1f2e0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1f2f0 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20  ite3_data_count 
1f300 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
1f310 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1f320 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
1f330 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
1f340 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
1f350 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1f360 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  data_count(.  vo
1f370 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f380 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f390 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f3a0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f3b0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1f3c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1f3d0 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1f3e0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1f3f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f400 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f410 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f420 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1f430 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1f440 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1f450 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1f460 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f470 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1f480 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1f490 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1f4a0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1f4b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f4c0 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1f4d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1f4e0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1f4f0 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70  te3_data_count(p
1f500 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
1f510 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f520 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1f530 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54  3_column_text ST
1f540 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1f550 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1f560 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53  olumn_decltype S
1f570 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1f580 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1f590 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54  column_name STMT
1f5a0 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
1f5b0 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
1f5c0 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63  utf8(.  void * c
1f5d0 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20  lientData,      
1f5e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1f5f0 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
1f600 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
1f610 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1f620 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1f630 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1f640 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1f650 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1f660 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1f670 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
1f680 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65  *(*xFunc)(sqlite
1f690 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20  3_stmt*, int);. 
1f6a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
1f6b0 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  t;..  xFunc = (c
1f6c0 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73  onst char *(*)(s
1f6d0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1f6e0 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
1f6f0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1f700 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1f710 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1f720 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1f730 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1f740 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1f750 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1f760 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1f770 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f780 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1f790 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1f7a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1f7b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1f7c0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1f7d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1f7e0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1f7f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1f800 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1f810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f820 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74  zRet = xFunc(pSt
1f830 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20  mt, col);.  if( 
1f840 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f  zRet ){.    Tcl_
1f850 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1f860 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20  , (char *)zRet, 
1f870 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1f880 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
1f890 69 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62  ic int test_glob
1f8a0 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f  al_recover(.  vo
1f8b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f8c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f8d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f8e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f8f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1f900 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f910 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 69  T_DEPRECATED.  i
1f920 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a  nt rc;.  if( obj
1f930 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1f940 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1f950 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
1f960 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f970 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1f980 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  c = sqlite3_glob
1f990 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20  al_recover();.  
1f9a0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1f9b0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1f9c0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1f9d0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64  CL_STATIC);.#end
1f9e0 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
1f9f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1fa00 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1fa10 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
1fa20 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1fa30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1fa40 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
1fa50 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1fa60 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1fa70 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
1fa80 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1fa90 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28  test_stmt_utf16(
1faa0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fab0 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69  Data,     /* Poi
1fac0 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1fad0 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1fae0 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
1faf0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1fb00 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1fb10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1fb20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1fb30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1fb40 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  F16.  sqlite3_st
1fb50 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1fb60 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   col;.  Tcl_Obj 
1fb70 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76  *pRet;.  const v
1fb80 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20  oid *zName16;.  
1fb90 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46  const void *(*xF
1fba0 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
1fbb0 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75  t*, int);..  xFu
1fbc0 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  nc = (const void
1fbd0 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74   *(*)(sqlite3_st
1fbe0 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74  mt*, int))client
1fbf0 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Data;.  if( objc
1fc00 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1fc10 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1fc20 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1fc30 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1fc40 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1fc50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1fc60 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1fc70 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1fc80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1fc90 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1fca0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1fcb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1fcc0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1fcd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fce0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1fcf0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1fd00 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1fd10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1fd20 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20  ROR;..  zName16 
1fd30 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
1fd40 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ol);.  if( zName
1fd50 31 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  16 ){.    int n;
1fd60 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1fd70 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20  *z = zName16;.  
1fd80 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20    for(n=0; z[n] 
1fd90 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29  || z[n+1]; n+=2)
1fda0 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63  {}.    pRet = Tc
1fdb0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1fdc0 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b  j(zName16, n+2);
1fdd0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
1fde0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
1fdf0 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  et);.  }.#endif 
1fe00 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1fe10 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72  TF16 */..  retur
1fe20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1fe30 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1fe40 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d  3_column_int STM
1fe50 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1fe60 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1fe70 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20  lumn_bytes STMT 
1fe80 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1fe90 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1fea0 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20  mn_bytes16 STMT 
1feb0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61  column.**.*/.sta
1fec0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
1fed0 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_int(.  void * 
1fee0 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f  clientData,    /
1fef0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
1ff00 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
1ff10 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a   to be invoked *
1ff20 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1ff30 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1ff40 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1ff50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1ff60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1ff70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1ff80 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
1ff90 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1ffa0 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  nt);..  xFunc = 
1ffb0 28 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33  (int (*)(sqlite3
1ffc0 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1ffd0 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1ffe0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1fff0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
20000 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
20010 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
20020 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
20030 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20040 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
20050 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
20060 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20070 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
20080 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
20090 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
200a0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
200b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
200c0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
200d0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
200e0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
200f0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
20100 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
20110 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
20120 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
20130 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  j(xFunc(pStmt, c
20140 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ol)));.  return 
20150 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20160 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
20170 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d  set_magic  DB  M
20180 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a  AGIC-NUMBER.**.*
20190 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61  * Set the db->ma
201a0 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73  gic value.  This
201b0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
201c0 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20   error recovery 
201d0 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
201e0 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f   int sqlite_set_
201f0 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20  magic(.  void * 
20200 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20210 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20220 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
20230 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
20240 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
20250 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
20260 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
20270 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
20280 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
20290 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
202a0 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42  ],.         " DB
202b0 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20   MAGIC", 0);.   
202c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
202d0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
202e0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
202f0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
20300 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20310 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
20320 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
20330 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d  E_MAGIC_OPEN")==
20340 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
20350 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
20360 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  C_OPEN;.  }else 
20370 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
20380 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
20390 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b  C_CLOSED")==0 ){
203a0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
203b0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
203c0 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OSED;.  }else if
203d0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
203e0 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
203f0 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  BUSY")==0 ){.   
20400 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
20410 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
20420 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
20430 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
20440 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22  ITE_MAGIC_ERROR"
20450 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
20460 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
20470 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  AGIC_ERROR;.  }e
20480 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49  lse if( Tcl_GetI
20490 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
204a0 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d  2], (int*)&db->m
204b0 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74  agic) ){.    ret
204c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
204d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
204e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
204f0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ge:  sqlite3_int
20500 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a  errupt  DB .**.*
20510 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74  * Trigger an int
20520 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a  errupt on DB.*/.
20530 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
20540 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69  interrupt(.  voi
20550 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
20560 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20570 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
20580 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
20590 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
205a0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
205b0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
205c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
205d0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
205e0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
205f0 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29  gv[0], " DB", 0)
20600 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20610 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
20620 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
20630 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
20640 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
20650 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
20660 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
20670 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
20680 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20  K;.}..static u8 
20690 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  *sqlite3_stack_b
206a0 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a  aseline = 0;../*
206b0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61  .** Fill the sta
206c0 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20  ck with a known 
206d0 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73  bitpattern..*/.s
206e0 74 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53  tatic void prepS
206f0 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e  tack(void){.  in
20700 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75  t i;.  u32 bigBu
20710 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28  f[65536];.  for(
20720 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69  i=0; i<sizeof(bi
20730 67 42 75 66 29 2f 73 69 7a 65 6f 66 28 62 69 67  gBuf)/sizeof(big
20740 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69  Buf[0]); i++) bi
20750 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64  gBuf[i] = 0xdead
20760 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  beef;.  sqlite3_
20770 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
20780 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35   (u8*)&bigBuf[65
20790 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  536];.}../*.** G
207a0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  et the current s
207b0 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65  tack depth.  Use
207c0 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
207d0 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  only..*/.u64 sql
207e0 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76  ite3StackDepth(v
207f0 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20  oid){.  u8 x;.  
20800 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c  return (u64)(sql
20810 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
20820 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a  ine - &x);.}../*
20830 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
20840 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44  te3_stack_used D
20850 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20  B SQL.**.** Try 
20860 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61  to measure the a
20870 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73  mount of stack s
20880 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63  pace used by a c
20890 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
208a0 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xec.*/.static in
208b0 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  t test_stack_use
208c0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
208d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
208e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
208f0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
20900 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
20910 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
20920 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  i;.  if( argc!=3
20930 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
20940 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
20950 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
20960 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
20970 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
20980 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
20990 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
209a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
209b0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
209c0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
209d0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
209e0 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61  ERROR;.  prepSta
209f0 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  ck();.  (void)sq
20a00 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
20a10 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29  rgv[2], 0, 0, 0)
20a20 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b  ;.  for(i=65535;
20a30 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29   i>=0 && ((u32*)
20a40 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
20a50 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64  seline)[-i]==0xd
20a60 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a  eadbeef; i--){}.
20a70 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20a80 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
20a90 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a  ewIntObj(i*4));.
20aa0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
20ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
20ac0 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66   sqlite_delete_f
20ad0 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74  unction DB funct
20ae0 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44  ion-name.**.** D
20af0 65 6c 65 74 65 20 74 68 65 20 75 73 65 72 20 66  elete the user f
20b00 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f  unction 'functio
20b10 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74  n-name' from dat
20b20 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e  abase handle DB.
20b30 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65   It.** is assume
20b40 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  d that the user 
20b50 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65  function was cre
20b60 61 74 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e  ated as UTF8, an
20b70 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  y number of.** a
20b80 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61  rguments (the wa
20b90 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  y the TCL interf
20ba0 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f  ace does it)..*/
20bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65  .static int dele
20bc0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
20bd0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
20be0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
20bf0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
20c00 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
20c10 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
20c20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
20c30 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
20c40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
20c50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
20c60 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
20c70 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
20c80 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
20c90 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
20ca0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
20cb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
20cc0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
20cd0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
20ce0 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
20cf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
20d00 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
20d10 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
20d20 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[2], -1, SQLI
20d30 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30  TE_UTF8, 0, 0, 0
20d40 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
20d50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
20d60 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
20d70 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
20d80 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
20d90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
20da0 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
20db0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20  te_collation DB 
20dc0 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a  collation-name.*
20dd0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
20de0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
20df0 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  ce 'collation-na
20e00 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
20e10 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e  e handle .** DB.
20e20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
20e30 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hat the collatio
20e40 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63  n sequence was c
20e50 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28  reated as UTF8 (
20e60 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20  the .** way the 
20e70 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
20e80 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
20e90 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c  c int delete_col
20ea0 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  lation(.  void *
20eb0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
20ec0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
20ed0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
20ee0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
20ef0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
20f00 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
20f10 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
20f20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
20f30 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
20f40 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
20f50 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
20f60 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
20f70 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
20f80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20f90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
20fa0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
20fb0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
20fc0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
20fd0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
20fe0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
20ff0 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  lation(db, argv[
21000 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  2], SQLITE_UTF8,
21010 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
21020 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
21030 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
21040 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
21050 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
21060 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
21070 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67  Usage: sqlite3_g
21080 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42  et_autocommit DB
21090 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
210a0 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
210b0 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74  se DB is current
210c0 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ly in auto-commi
210d0 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72  t mode..** Retur
210e0 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  n false if not..
210f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
21100 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20  t_autocommit(.  
21110 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
21120 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
21130 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
21140 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
21150 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  gv.){.  char zBu
21160 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  f[30];.  sqlite3
21170 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
21180 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
21190 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
211a0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
211b0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
211c0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
211d0 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
211e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
211f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
21200 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
21210 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
21220 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
21230 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
21240 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
21250 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64  zBuf), zBuf, "%d
21260 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  ", sqlite3_get_a
21270 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a  utocommit(db));.
21280 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
21290 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
212a0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
212b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
212c0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75  sage: sqlite3_bu
212d0 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53  sy_timeout DB MS
212e0 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  .**.** Set the b
212f0 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68  usy timeout.  Th
21300 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c  is is more easil
21310 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65  y done using the
21320 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68   timeout.** meth
21330 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e  od of the TCL in
21340 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77 65  terface.  But we
21350 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20 74   need a way to t
21360 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  est the case.** 
21370 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e 73  where it returns
21380 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a   SQLITE_MISUSE..
21390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
213a0 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  st_busy_timeout(
213b0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
213c0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
213d0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
213e0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
213f0 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
21400 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33  c, ms;.  sqlite3
21410 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
21420 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
21430 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
21440 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
21450 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
21460 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
21470 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
21480 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
21490 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
214a0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
214b0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
214c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
214d0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
214e0 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
214f0 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  rgv[2], &ms) ) r
21500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21510 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
21520 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
21530 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   ms);.  Tcl_Appe
21540 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
21550 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
21560 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
21570 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
21580 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76  ** Usage:  tcl_v
21590 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52  ariable_type VAR
215a0 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  IABLENAME.**.** 
215b0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
215c0 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
215d0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
215e0 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
215f0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72  of the given var
21600 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
21610 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c   int tcl_variabl
21620 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a  e_type(.  void *
21630 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
21640 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21650 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
21660 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
21670 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f  objv[].){.  Tcl_
21680 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28  Obj *pVar;.  if(
21690 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
216a0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
216b0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
216c0 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20  , "VARIABLE");. 
216d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
216e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20  ROR;.  }.  pVar 
216f0 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28  = Tcl_GetVar2Ex(
21700 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
21710 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
21720 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52  0, TCL_LEAVE_ERR
21730 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61  _MSG);.  if( pVa
21740 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  r==0 ) return TC
21750 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70  L_ERROR;.  if( p
21760 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a  Var->typePtr ){.
21770 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
21780 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
21790 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
217a0 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
217b0 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72  e, -1));.  }.  r
217c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
217d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
217e0 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
217f0 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20  emory ?N?.**.** 
21800 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
21810 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
21820 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74  tly held but not
21830 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
21840 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67  ed..** The integ
21850 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  er N is the numb
21860 65 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61  er of bytes we a
21870 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c  re trying to rel
21880 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72  ease.  The .** r
21890 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
218a0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
218b0 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c  ory actually rel
218c0 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eased..*/.static
218d0 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73   int test_releas
218e0 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64  e_memory(.  void
218f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
21900 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21910 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
21920 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21930 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
21940 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
21950 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
21960 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66  AGEMENT) && !def
21970 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21980 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e  _DISKIO).  int N
21990 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69  ;.  int amt;.  i
219a0 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
219b0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
219c0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
219d0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
219e0 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
219f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
21a00 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
21a10 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
21a20 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
21a30 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29  rp, objv[1], &N)
21a40 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21a50 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
21a60 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20    N = -1;.  }.  
21a70 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  amt = sqlite3_re
21a80 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b  lease_memory(N);
21a90 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
21aa0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
21ab0 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b  NewIntObj(amt));
21ac0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
21ad0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
21ae0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
21af0 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
21b00 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74  mory DB.**.** At
21b10 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65  tempt to release
21b20 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c   memory currentl
21b30 79 20 68 65 6c 64 20 62 79 20 64 61 74 61 62 61  y held by databa
21b40 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e 20 74  se DB.  Return t
21b50 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64  he.** result cod
21b60 65 20 28 77 68 69 63 68 20 69 6e 20 74 68 65 20  e (which in the 
21b70 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
21b80 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  tation is always
21b90 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69   zero)..*/.stati
21ba0 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65  c int test_db_re
21bb0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20  lease_memory(.  
21bc0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
21bd0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
21be0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
21bf0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
21c00 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
21c10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
21c20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
21c30 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
21c40 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
21c50 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
21c60 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
21c70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
21c80 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
21c90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
21ca0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
21cb0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
21cc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
21cd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  c = sqlite3_db_r
21ce0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62  elease_memory(db
21cf0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
21d00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
21d10 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
21d20 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
21d30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
21d40 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  e:  sqlite3_db_c
21d50 61 63 68 65 66 6c 75 73 68 20 44 42 0a 2a 2a 0a  acheflush DB.**.
21d60 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6c  ** Attempt to fl
21d70 75 73 68 20 61 6e 79 20 64 69 72 74 79 20 70 61  ush any dirty pa
21d80 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ges to disk..*/.
21d90 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
21da0 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 0a 20  db_cacheflush(. 
21db0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
21dc0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
21dd0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
21de0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
21df0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
21e00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
21e10 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
21e20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
21e30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
21e40 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
21e50 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75   "DB");.    retu
21e60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21e70 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
21e80 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
21e90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
21ea0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
21eb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  rc = sqlite3_db_
21ed0 63 61 63 68 65 66 6c 75 73 68 28 64 62 29 3b 0a  cacheflush(db);.
21ee0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21ef0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
21f00 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
21f10 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
21f20 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
21f30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21f40 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52  OR;.  }..  Tcl_R
21f50 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
21f60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
21f70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
21f80 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 79  age:  sqlite3_sy
21f90 73 74 65 6d 5f 65 72 72 6e 6f 20 44 42 0a 2a 2a  stem_errno DB.**
21fa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
21fb0 6f 77 2d 6c 65 76 65 6c 20 73 79 73 74 65 6d 20  ow-level system 
21fc0 65 72 72 6e 6f 20 76 61 6c 75 65 2e 0a 2a 2f 0a  errno value..*/.
21fd0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
21fe0 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 0a 20 20  system_errno(.  
21ff0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
22000 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
22010 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
22020 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
22030 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
22040 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
22050 20 69 6e 74 20 69 45 72 72 6e 6f 3b 0a 20 20 69   int iErrno;.  i
22060 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
22070 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
22080 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
22090 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
220a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
220b0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
220c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
220d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
220e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
220f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22100 0a 20 20 69 45 72 72 6e 6f 20 3d 20 73 71 6c 69  .  iErrno = sqli
22110 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f  te3_system_errno
22120 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
22130 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
22140 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69   Tcl_NewIntObj(i
22150 45 72 72 6e 6f 29 29 3b 0a 20 20 72 65 74 75 72  Errno));.  retur
22160 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
22170 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
22180 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 20 44  e3_db_filename D
22190 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  B DBNAME.**.** R
221a0 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
221b0 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63 69 61  f a file associa
221c0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
221d0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
221e0 6e 74 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e  nt test_db_filen
221f0 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ame(.  void * cl
22200 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
22210 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
22220 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
22230 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22240 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
22250 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
22260 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69  ar *zDbName;.  i
22270 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
22280 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
22290 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
222a0 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29  jv, "DB DBNAME")
222b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
222c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
222d0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
222e0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
222f0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
22300 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
22310 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d  _ERROR;.  zDbNam
22320 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
22330 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63  g(objv[2]);.  Tc
22340 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
22350 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 64  nterp, sqlite3_d
22360 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a  b_filename(db, z
22370 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29  DbName), (void*)
22380 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
22390 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
223a0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
223b0 5f 72 65 61 64 6f 6e 6c 79 20 44 42 20 44 42 4e  _readonly DB DBN
223c0 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
223d0 20 31 20 6f 72 20 30 20 69 66 20 44 42 4e 41 4d   1 or 0 if DBNAM
223e0 45 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f 72  E is readonly or
223f0 20 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d 31   not.  Return -1
22400 20 69 66 20 44 42 4e 41 4d 45 20 64 6f 65 73 0a   if DBNAME does.
22410 2a 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  ** not exist..*/
22420 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
22430 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20  _db_readonly(.  
22440 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
22450 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
22460 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
22470 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
22480 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
22490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
224a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
224b0 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Name;.  if( objc
224c0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
224d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
224e0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
224f0 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72   DBNAME");.    r
22500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22510 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22520 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22530 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22540 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
22550 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22560 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c  .  zDbName = Tcl
22570 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
22580 32 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  2]);.  Tcl_SetOb
22590 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
225a0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
225b0 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
225c0 79 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 29 29  y(db, zDbName)))
225d0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
225e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
225f0 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  e:  sqlite3_soft
22600 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a  _heap_limit ?N?.
22610 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20 73  **.** Query or s
22620 65 74 20 74 68 65 20 73 6f 66 74 20 68 65 61 70  et the soft heap
22630 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20 63   limit for the c
22640 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20  urrent thread.  
22650 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20  The.** limit is 
22660 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20  only changed if 
22670 74 68 65 20 4e 20 69 73 20 70 72 65 73 65 6e 74  the N is present
22680 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75 73 20  .  The previous 
22690 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74 75  limit.** is retu
226a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
226b0 69 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f 68 65  int test_soft_he
226c0 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64  ap_limit(.  void
226d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
226e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
226f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
22700 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
22710 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
22720 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6d 74 3b  lite3_int64 amt;
22730 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 4e  .  Tcl_WideInt N
22740 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 6f 62 6a   = -1;.  if( obj
22750 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=1 && objc!=2 
22760 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
22770 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
22780 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b  1, objv, "?N?");
22790 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
227a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
227b0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
227c0 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
227d0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
227e0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29  , objv[1], &N) )
227f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22800 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73  R;.  }.  amt = s
22810 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
22820 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 54  _limit64(N);.  T
22830 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
22840 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
22850 69 64 65 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b  ideIntObj(amt));
22860 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
22870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
22880 3a 20 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65  :   sqlite3_thre
22890 61 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a  ad_cleanup.**.**
228a0 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
228b0 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
228c0 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   API..*/.static 
228d0 69 6e 74 20 74 65 73 74 5f 74 68 72 65 61 64 5f  int test_thread_
228e0 63 6c 65 61 6e 75 70 28 0a 20 20 76 6f 69 64 20  cleanup(.  void 
228f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
22900 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
22910 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
22920 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
22930 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
22940 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
22950 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69  EPRECATED.  sqli
22960 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
22970 75 70 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  up();.#endif.  r
22980 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22990 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
229a0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
229b0 66 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a  fcounts  DB.**.*
229c0 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
229d0 6f 66 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  of numbers which
229e0 20 61 72 65 20 74 68 65 20 50 61 67 65 72 52 65   are the PagerRe
229f0 66 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a  fcount for all.*
22a00 2a 20 70 61 67 65 72 73 20 6f 6e 20 65 61 63 68  * pagers on each
22a10 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22a20 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
22a30 69 6e 74 20 74 65 73 74 5f 70 61 67 65 72 5f 72  int test_pager_r
22a40 65 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f 69 64  efcounts(.  void
22a50 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
22a60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
22a70 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
22a80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
22a90 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
22aa0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
22ab0 20 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a 61 3b   i;.  int v, *a;
22ac0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73  .  Tcl_Obj *pRes
22ad0 75 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ult;..  if( objc
22ae0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
22af0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
22b00 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
22b10 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
22b20 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
22b30 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
22b40 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
22b50 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
22b60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
22b70 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
22b80 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
22b90 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
22ba0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
22bb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70  n TCL_ERROR;.  p
22bc0 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77  Result = Tcl_New
22bd0 4f 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Obj();.  for(i=0
22be0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
22bf0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
22c00 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a  Db[i].pBt==0 ){.
22c10 20 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20        v = -1;.  
22c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
22c30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
22c40 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
22c50 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
22c60 50 61 67 65 72 53 74 61 74 73 28 73 71 6c 69 74  PagerStats(sqlit
22c70 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
22c80 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20  >aDb[i].pBt));. 
22c90 20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b 0a 20       v = a[0];. 
22ca0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
22cb0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
22cc0 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ex);.    }.    T
22cd0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
22ce0 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 73 75  Element(0, pResu
22cf0 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  lt, Tcl_NewIntOb
22d00 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  j(v));.  }.  Tcl
22d10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
22d20 74 65 72 70 2c 20 70 52 65 73 75 6c 74 29 3b 0a  terp, pResult);.
22d30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22d40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
22d50 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62  d:   working_64b
22d60 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d  it_int.**.** Som
22d70 65 20 54 43 4c 20 62 75 69 6c 64 73 20 28 65 78  e TCL builds (ex
22d80 3a 20 63 79 67 77 69 6e 29 20 64 6f 20 6e 6f 74  : cygwin) do not
22d90 20 73 75 70 70 6f 72 74 20 36 34 2d 62 69 74 20   support 64-bit 
22da0 69 6e 74 65 67 65 72 73 2e 20 20 54 68 69 73 0a  integers.  This.
22db0 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61 20 6e 75  ** leads to a nu
22dc0 6d 62 65 72 20 6f 66 20 74 65 73 74 20 66 61 69  mber of test fai
22dd0 6c 75 72 65 73 2e 20 20 54 68 65 20 70 72 65 73  lures.  The pres
22de0 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68 65 63  ent command chec
22df0 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20 62 75  ks the.** TCL bu
22e00 69 6c 64 20 74 6f 20 73 65 65 20 77 68 65 74 68  ild to see wheth
22e10 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 73 75 70  er or not it sup
22e20 70 6f 72 74 73 20 36 34 2d 62 69 74 20 69 6e 74  ports 64-bit int
22e30 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20 72 65  egers.  It.** re
22e40 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 69 74  turns TRUE if it
22e50 20 64 6f 65 73 20 61 6e 64 20 46 41 4c 53 45 20   does and FALSE 
22e60 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  if not..**.** Th
22e70 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
22e80 65 64 20 74 6f 20 77 61 72 6e 20 75 73 65 72 73  ed to warn users
22e90 20 74 68 61 74 20 74 68 65 69 72 20 54 43 4c 20   that their TCL 
22ea0 62 75 69 6c 64 20 69 73 20 64 65 66 65 63 74 69  build is defecti
22eb0 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74  ve.** and that t
22ec0 68 65 20 65 72 72 6f 72 73 20 74 68 65 79 20 61  he errors they a
22ed0 72 65 20 73 65 65 69 6e 67 20 69 6e 20 74 68 65  re seeing in the
22ee0 20 74 65 73 74 20 73 63 72 69 70 74 73 20 6d 69   test scripts mi
22ef0 67 68 74 20 62 65 0a 2a 2a 20 61 20 72 65 73 75  ght be.** a resu
22f00 6c 74 20 6f 66 20 74 68 65 69 72 20 64 65 66 65  lt of their defe
22f10 63 74 69 76 65 20 54 43 4c 20 72 61 74 68 65 72  ctive TCL rather
22f20 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73 20 69   than problems i
22f30 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61  n SQLite..*/.sta
22f40 74 69 63 20 69 6e 74 20 77 6f 72 6b 69 6e 67 5f  tic int working_
22f50 36 34 62 69 74 5f 69 6e 74 28 0a 20 20 43 6c 69  64bit_int(.  Cli
22f60 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
22f70 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
22f80 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
22f90 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
22fa0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22fb0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
22fc0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
22fd0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
22fe0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
22ff0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
23000 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23010 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
23020 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23030 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
23040 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
23050 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  /.){.  Tcl_Obj *
23060 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e 74 20  pTestObj;.  int 
23070 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20 20  working = 0;..  
23080 70 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e  pTestObj = Tcl_N
23090 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 31 30 30  ewWideIntObj(100
230a0 30 30 30 30 2a 28 69 36 34 29 31 32 33 34 35 36  0000*(i64)123456
230b0 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69 6e 67  7890);.  working
230c0 20 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65   = strcmp(Tcl_Ge
230d0 74 53 74 72 69 6e 67 28 70 54 65 73 74 4f 62 6a  tString(pTestObj
230e0 29 2c 20 22 31 32 33 34 35 36 37 38 39 30 30 30  ), "123456789000
230f0 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54 63 6c  0000")==0;.  Tcl
23100 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _DecrRefCount(pT
23110 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 53  estObj);.  Tcl_S
23120 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
23130 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
23140 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29 29 3b  anObj(working));
23150 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23160 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
23170 6d 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b  md:   vfs_unlink
23180 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _test.**.** This
23190 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e 72   TCL command unr
231a0 65 67 69 73 74 65 72 73 20 74 68 65 20 70 72 69  egisters the pri
231b0 6d 61 72 79 20 56 46 53 20 61 6e 64 20 74 68 65  mary VFS and the
231c0 6e 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  n registers.** i
231d0 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20 54  t back again.  T
231e0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
231f0 65 73 74 20 74 68 65 20 61 62 69 6c 69 74 79 20  est the ability 
23200 74 6f 20 72 65 67 69 73 74 65 72 20 61 0a 2a 2a  to register a.**
23210 20 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65 20 61   VFS when none a
23220 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  re previously re
23230 67 69 73 74 65 72 65 64 2c 20 61 6e 64 20 74 68  gistered, and th
23240 65 20 61 62 69 6c 69 74 79 20 74 6f 20 0a 2a 2a  e ability to .**
23250 20 75 6e 72 65 67 69 73 74 65 72 20 74 68 65 20   unregister the 
23260 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 56  only available V
23270 46 53 2e 20 20 54 69 63 6b 65 74 20 23 32 37 33  FS.  Ticket #273
23280 38 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  8.*/.static int 
23290 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 28  vfs_unlink_test(
232a0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
232b0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
232c0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
232d0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
232e0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
232f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
23300 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
23310 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
23320 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
23330 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23350 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
23360 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
23370 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
23380 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
23390 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
233a0 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   i;.  sqlite3_vf
233b0 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71 6c 69  s *pMain;.  sqli
233c0 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32  te3_vfs *apVfs[2
233d0 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  0];.  sqlite3_vf
233e0 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20 20 73  s one, two;..  s
233f0 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
23400 69 73 74 65 72 28 30 29 3b 20 20 20 2f 2a 20 55  ister(0);   /* U
23410 6e 72 65 67 69 73 74 65 72 20 6f 66 20 4e 55 4c  nregister of NUL
23420 4c 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f  L is harmless */
23430 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22  .  one.zName = "
23440 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e  __one";.  two.zN
23450 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a  ame = "__two";..
23460 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c    /* Calling sql
23470 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
23480 72 20 77 69 74 68 20 32 6e 64 20 61 72 67 75 6d  r with 2nd argum
23490 65 6e 74 20 6f 66 20 30 20 64 6f 65 73 20 6e 6f  ent of 0 does no
234a0 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 74 68  t.  ** change th
234b0 65 20 64 65 66 61 75 6c 74 20 56 46 53 0a 20 20  e default VFS.  
234c0 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73 71 6c  */.  pMain = sql
234d0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
234e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
234f0 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 30  register(&one, 0
23500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  );.  assert( pMa
23510 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d  in==0 || pMain==
23520 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
23530 28 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  (0) );.  sqlite3
23540 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 74  _vfs_register(&t
23550 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  wo, 0);.  assert
23560 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d  ( pMain==0 || pM
23570 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  ain==sqlite3_vfs
23580 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f  _find(0) );..  /
23590 2a 20 57 65 20 63 61 6e 20 66 69 6e 64 20 61 20  * We can find a 
235a0 56 46 53 20 62 79 20 69 74 73 20 6e 61 6d 65 20  VFS by its name 
235b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
235c0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
235d0 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a  _one")==&one );.
235e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
235f0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
23600 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a 20 20  o")==&two );..  
23610 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74  /* Calling sqlit
23620 65 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20 77  e_vfs_register w
23630 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63  ith non-zero sec
23640 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 63 68  ond parameter ch
23650 61 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a 20 64  anges the.  ** d
23660 65 66 61 75 6c 74 20 56 46 53 2c 20 65 76 65 6e  efault VFS, even
23670 20 69 66 20 74 68 65 20 31 73 74 20 70 61 72 61   if the 1st para
23680 6d 65 74 65 72 20 69 73 20 61 6e 20 65 78 69 73  meter is an exis
23690 74 69 67 20 56 46 53 20 74 68 61 74 20 69 73 0a  tig VFS that is.
236a0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
236b0 72 65 67 69 73 74 65 72 65 64 20 61 73 20 74 68  registered as th
236c0 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e 0a 20  e non-default.. 
236d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
236e0 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
236f0 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73   1);.  assert( s
23700 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
23710 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
23720 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23730 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
23740 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  two")==&two );. 
23750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23760 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 6f  _vfs_find(0)==&o
23770 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ne );.  sqlite3_
23780 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 74 77  vfs_register(&tw
23790 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 1);.  assert(
237a0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
237b0 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
237c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
237d0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
237e0 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
237f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23800 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
23810 26 74 77 6f 20 29 3b 0a 20 20 69 66 28 20 70 4d  &two );.  if( pM
23820 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
23830 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
23840 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 61  pMain, 1);.    a
23850 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
23860 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
23870 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20 61 73  ==&one );.    as
23880 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
23890 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d  s_find("__two")=
238a0 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20 61 73 73  =&two );.    ass
238b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
238c0 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
238d0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 55  );.  }.  .  /* U
238e0 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66 61 75 6c  nlink the defaul
238f0 74 20 56 46 53 2e 20 20 52 65 70 65 61 74 20 75  t VFS.  Repeat u
23900 6e 74 69 6c 20 74 68 65 72 65 20 61 72 65 20 6e  ntil there are n
23910 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a 20 20 2a  o more VFSes.  *
23920 2a 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20  * registered..  
23930 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
23940 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69  sizeof(apVfs)/si
23950 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 3b 20  zeof(apVfs[0]); 
23960 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b  i++){.    apVfs[
23970 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  i] = sqlite3_vfs
23980 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66  _find(0);.    if
23990 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20  ( apVfs[i] ){.  
239a0 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
239b0 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
239c0 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
239d0 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 20  >zName) );.     
239e0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
239f0 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
23a00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23a10 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f   0==sqlite3_vfs_
23a20 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a  find(apVfs[i]->z
23a30 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Name) );.    }. 
23a40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d   }.  assert( 0==
23a50 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
23a60 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 52  (0) );.  .  /* R
23a70 65 67 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e  egister the main
23a80 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65 66 61   VFS as non-defa
23a90 75 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d 61 64  ult (will be mad
23aa0 65 20 64 65 66 61 75 6c 74 2c 20 73 69 6e 63 65  e default, since
23ab0 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65 20 74  .  ** it'll be t
23ac0 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 20 65  he only one in e
23ad0 78 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a  xistence)..  */.
23ae0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
23af0 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 30 29  gister(pMain, 0)
23b00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23b10 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
23b20 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20 20 2f  =pMain );.  .  /
23b30 2a 20 55 6e 2d 72 65 67 69 73 74 65 72 20 74 68  * Un-register th
23b40 65 20 6d 61 69 6e 20 56 46 53 20 61 67 61 69 6e  e main VFS again
23b50 20 74 6f 20 72 65 73 74 6f 72 65 20 61 6e 20 65   to restore an e
23b60 6d 70 74 79 20 56 46 53 20 6c 69 73 74 20 2a 2f  mpty VFS list */
23b70 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
23b80 6e 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 29  nregister(pMain)
23b90 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ;.  assert( 0==s
23ba0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
23bb0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69  0) );..  /* Reli
23bc0 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20 69 6e 20  nk all VFSes in 
23bd0 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 20 2a  reverse order. *
23be0 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73 69 7a 65  /  .  for(i=size
23bf0 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66  of(apVfs)/sizeof
23c00 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20 69 3e  (apVfs[0])-1; i>
23c10 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
23c20 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20  ( apVfs[i] ){.  
23c30 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
23c40 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69  register(apVfs[i
23c50 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  ], 1);.      ass
23c60 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73  ert( apVfs[i]==s
23c70 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
23c80 30 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  0) );.      asse
23c90 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71  rt( apVfs[i]==sq
23ca0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61  lite3_vfs_find(a
23cb0 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20  pVfs[i]->zName) 
23cc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
23cd0 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 75  /* Unregister ou
23ce0 74 20 73 61 6d 70 6c 65 20 56 46 53 65 73 2e 20  t sample VFSes. 
23cf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
23d00 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65  _unregister(&one
23d10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
23d20 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f  _unregister(&two
23d30 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73  );..  /* Unregis
23d40 74 65 72 69 6e 67 20 61 20 56 46 53 20 74 68 61  tering a VFS tha
23d50 74 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  t is not current
23d60 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 69 73  ly registered is
23d70 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 73   harmless */.  s
23d80 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
23d90 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73  ister(&one);.  s
23da0 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
23db0 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 20 20 61  ister(&two);.  a
23dc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
23dd0 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
23de0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23df0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
23e00 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20 29 3b  d("__two")==0 );
23e10 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64  ..  /* We should
23e20 20 62 65 20 6c 65 66 74 20 77 69 74 68 20 74 68   be left with th
23e30 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 66 61 75  e original defau
23e40 6c 74 20 56 46 53 20 62 61 63 6b 20 61 73 20 74  lt VFS back as t
23e50 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
23e60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
23e70 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
23e80 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20 20 72  )==pMain );..  r
23e90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
23ea0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
23eb0 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65   vfs_initfail_te
23ec0 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  st.**.** This TC
23ed0 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65 6d 70  L command attemp
23ee0 74 73 20 74 6f 20 76 66 73 5f 66 69 6e 64 20 61  ts to vfs_find a
23ef0 6e 64 20 76 66 73 5f 72 65 67 69 73 74 65 72 20  nd vfs_register 
23f00 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  when the.** sqli
23f10 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
23f20 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 66 61   interface is fa
23f30 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61 6c 6c  iling.  All call
23f40 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a  s should fail..*
23f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
23f60 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 28 0a  _initfail_test(.
23f70 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
23f80 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
23f90 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
23fa0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
23fb0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
23fc0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
23fd0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
23fe0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
23ff0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
24000 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
24010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24020 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
24030 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
24040 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
24050 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
24060 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
24070 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20 20 6f  te3_vfs one;.  o
24080 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e  ne.zName = "__on
24090 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  e";..  if( sqlit
240a0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
240b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
240c0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  R;.  sqlite3_vfs
240d0 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
240e0 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
240f0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20  3_vfs_find(0) ) 
24100 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24110 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
24120 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31  register(&one, 1
24130 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
24140 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72  _vfs_find(0) ) r
24150 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24160 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
24170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64  ;.}../*.** Saved
24180 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74 69 63   VFSes.*/.static
24190 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70   sqlite3_vfs *ap
241a0 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69 63 20  Vfs[20];.static 
241b0 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f  int nVfs = 0;../
241c0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
241d0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c  fs_unregister_al
241e0 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69 73 74  l.**.** Unregist
241f0 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f  er all VFSes..*/
24200 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
24210 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a  unregister_all(.
24220 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
24230 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
24240 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
24250 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
24260 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
24270 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
24280 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
24290 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
242a0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
242b0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
242c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
242d0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
242e0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
242f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
24300 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
24310 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
24320 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
24330 41 72 72 61 79 53 69 7a 65 28 61 70 56 66 73 29  ArraySize(apVfs)
24340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66  ; i++){.    apVf
24350 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  s[i] = sqlite3_v
24360 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20  fs_find(0);.    
24370 69 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20  if( apVfs[i]==0 
24380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
24390 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
243a0 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20  ter(apVfs[i]);. 
243b0 20 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20   }.  nVfs = i;. 
243c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
243d0 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
243e0 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72    vfs_reregister
243f0 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f  _all.**.** Resto
24400 72 65 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61  re all VFSes tha
24410 74 20 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75  t were removed u
24420 73 69 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73  sing vfs_unregis
24430 74 65 72 5f 61 6c 6c 2e 20 54 61 6b 69 6e 67 0a  ter_all. Taking.
24440 2a 2a 20 63 61 72 65 20 74 6f 20 70 75 74 20 74  ** care to put t
24450 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62  he linked list b
24460 61 63 6b 20 74 6f 67 65 74 68 65 72 20 69 6e 20  ack together in 
24470 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
24480 73 20 69 74 20 77 61 73 0a 2a 2a 20 69 6e 20 62  s it was.** in b
24490 65 66 6f 72 65 20 76 66 73 5f 75 6e 72 65 67 69  efore vfs_unregi
244a0 73 74 65 72 5f 61 6c 6c 20 77 61 73 20 69 6e 76  ster_all was inv
244b0 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oked..*/.static 
244c0 69 6e 74 20 76 66 73 5f 72 65 72 65 67 69 73 74  int vfs_reregist
244d0 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74  er_all(.  Client
244e0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
244f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
24500 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
24510 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
24520 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
24530 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
24540 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
24550 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
24560 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
24570 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
24580 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24590 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
245a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
245b0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
245c0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
245d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
245e0 28 69 3d 6e 56 66 73 2d 31 3b 20 69 3e 3d 30 3b  (i=nVfs-1; i>=0;
245f0 20 69 2d 2d 29 7b 0a 20 20 20 20 73 71 6c 69 74   i--){.    sqlit
24600 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
24610 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20  apVfs[i], 1);.  
24620 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
24630 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
24640 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
24650 72 6f 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a  rol_test DB.**.*
24660 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
24670 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
24680 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24690 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
246a0 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
246b0 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
246c0 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61  the same..*/.sta
246d0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
246e0 74 72 6f 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69  trol_test(.  Cli
246f0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
24700 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
24710 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
24720 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24730 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24740 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
24750 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24760 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24770 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24780 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24790 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
247a0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
247b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
247c0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
247d0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
247e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20  /.){.  int iArg 
247f0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
24800 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
24810 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
24820 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
24830 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
24840 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
24850 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
24860 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
24870 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
24880 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
24890 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
248a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
248b0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
248c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
248d0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
248e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
248f0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
24900 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24910 6c 28 64 62 2c 20 30 2c 20 30 2c 20 26 69 41 72  l(db, 0, 0, &iAr
24920 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
24930 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
24940 44 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  D );.  rc = sqli
24950 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24960 28 64 62 2c 20 22 6e 6f 74 61 64 61 74 61 62 61  (db, "notadataba
24970 73 65 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  se", SQLITE_FCNT
24980 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 69 41  L_LOCKSTATE, &iA
24990 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rg);.  assert( r
249a0 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
249b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
249c0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
249d0 62 2c 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26  b, "main", -1, &
249e0 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
249f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
24a00 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20 73  OUND );.  rc = s
24a10 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24a20 72 6f 6c 28 64 62 2c 20 22 74 65 6d 70 22 2c 20  rol(db, "temp", 
24a30 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73  -1, &iArg);.  as
24a40 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
24a50 5f 4e 4f 54 46 4f 55 4e 44 20 7c 7c 20 72 63 3d  _NOTFOUND || rc=
24a60 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b  =SQLITE_ERROR );
24a70 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
24a80 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
24a90 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
24aa0 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
24ab0 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73  st DB.**.** This
24ac0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
24ad0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
24ae0 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
24af0 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
24b00 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
24b10 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ration of the SQ
24b20 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20  LITE_LAST_ERRNO 
24b30 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  verb..*/.static 
24b40 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
24b50 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 28  _lasterrno_test(
24b60 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
24b70 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
24b80 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
24b90 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
24ba0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
24bb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
24bc0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
24bd0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
24be0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
24bf0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c10 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
24c20 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
24c30 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
24c40 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24c50 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
24c60 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c   iArg = 0;.  sql
24c70 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
24c80 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
24c90 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
24ca0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
24cb0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
24cc0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
24cd0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
24ce0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
24cf0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
24d00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24d10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24d20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24d30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
24d40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
24d50 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
24d60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24d70 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
24d80 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24d90 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
24da0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69  E_LAST_ERRNO, &i
24db0 41 72 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Arg);.  if( rc )
24dc0 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  { .    Tcl_SetOb
24dd0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
24de0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
24df0 29 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e 20  )); .    return 
24e00 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a  TCL_ERROR; .  }.
24e10 20 20 69 66 28 20 69 41 72 67 21 3d 30 20 29 20    if( iArg!=0 ) 
24e20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
24e30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
24e40 55 6e 65 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a  Unexpected non-z
24e50 65 72 6f 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20  ero errno: ",.  
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
24e80 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49  FromObj(Tcl_NewI
24e90 6e 74 4f 62 6a 28 69 41 72 67 29 2c 20 30 29 2c  ntObj(iArg), 0),
24ea0 20 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   " ", 0);.    re
24eb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
24ed0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66 64 65 66  _OK;  .}..#ifdef
24ee0 20 5f 5f 41 50 50 4c 45 5f 5f 0a 2f 2a 20 46 72   __APPLE__./* Fr
24ef0 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72 69 76 61  om sqlite3_priva
24f00 74 65 2e 68 20 2a 2f 0a 23 20 69 66 6e 64 65 66  te.h */.# ifndef
24f10 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
24f20 5f 44 41 54 41 42 41 53 45 0a 23 20 64 65 66 69  _DATABASE.# defi
24f30 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  ne SQLITE_TRUNCA
24f40 54 45 5f 44 41 54 41 42 41 53 45 20 20 20 20 20  TE_DATABASE     
24f50 20 31 30 31 0a 23 20 64 65 66 69 6e 65 20 53 51   101.# define SQ
24f60 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 4a 4f  LITE_TRUNCATE_JO
24f70 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
24f80 20 20 20 20 20 20 20 20 28 30 78 31 3c 3c 30 29          (0x1<<0)
24f90 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
24fa0 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41  _TRUNCATE_AUTOVA
24fb0 43 55 55 4d 5f 4d 41 53 4b 20 20 20 20 20 20 20  CUUM_MASK       
24fc0 20 20 20 20 28 30 78 33 3c 3c 32 29 0a 23 20 64      (0x3<<2).# d
24fd0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55  efine SQLITE_TRU
24fe0 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d  NCATE_AUTOVACUUM
24ff0 5f 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 20  _OFF            
25000 28 30 78 31 3c 3c 32 29 0a 23 20 64 65 66 69 6e  (0x1<<2).# defin
25010 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  e SQLITE_TRUNCAT
25020 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
25030 4c 20 20 20 20 20 20 20 20 20 20 20 28 30 78 32  L           (0x2
25040 3c 3c 32 29 0a 23 20 64 65 66 69 6e 65 20 53 51  <<2).# define SQ
25050 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55  LITE_TRUNCATE_AU
25060 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 45 4d 45  TOVACUUM_INCREME
25070 4e 54 41 4c 20 20 20 20 28 30 78 33 3c 3c 32 29  NTAL    (0x3<<2)
25080 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
25090 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49  _TRUNCATE_PAGESI
250a0 5a 45 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  ZE_MASK         
250b0 20 20 20 20 28 30 78 37 3c 3c 34 29 0a 23 20 64      (0x7<<4).# d
250c0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55  efine SQLITE_TRU
250d0 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 31  NCATE_PAGESIZE_1
250e0 30 32 34 20 20 20 20 20 20 20 20 20 20 20 20 20  024             
250f0 28 30 78 31 3c 3c 34 29 0a 23 20 64 65 66 69 6e  (0x1<<4).# defin
25100 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  e SQLITE_TRUNCAT
25110 45 5f 50 41 47 45 53 49 5a 45 5f 32 30 34 38 20  E_PAGESIZE_2048 
25120 20 20 20 20 20 20 20 20 20 20 20 20 28 30 78 32              (0x2
25130 3c 3c 34 29 0a 23 20 64 65 66 69 6e 65 20 53 51  <<4).# define SQ
25140 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41  LITE_TRUNCATE_PA
25150 47 45 53 49 5a 45 5f 34 30 39 36 20 20 20 20 20  GESIZE_4096     
25160 20 20 20 20 20 20 20 20 28 30 78 33 3c 3c 34 29          (0x3<<4)
25170 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
25180 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49  _TRUNCATE_PAGESI
25190 5a 45 5f 38 31 39 32 20 20 20 20 20 20 20 20 20  ZE_8192         
251a0 20 20 20 20 28 30 78 34 3c 3c 34 29 0a 23 20 65      (0x4<<4).# e
251b0 6e 64 69 66 0a 23 20 69 66 6e 64 65 66 20 53 51  ndif.# ifndef SQ
251c0 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f 44 41 54  LITE_REPLACE_DAT
251d0 41 42 41 53 45 0a 23 20 64 65 66 69 6e 65 20 53  ABASE.# define S
251e0 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f 44 41  QLITE_REPLACE_DA
251f0 54 41 42 41 53 45 20 20 20 20 20 20 20 31 30 32  TABASE       102
25200 0a 23 20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  .# endif../*.** 
25210 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
25220 6f 6e 74 72 6f 6c 5f 74 72 75 6e 63 61 74 65 5f  ontrol_truncate_
25230 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68  test DB.**.** Th
25240 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
25250 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
25260 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
25270 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
25280 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
25290 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
252a0 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
252b0 44 41 54 41 42 41 53 45 20 76 65 72 62 2e 0a 2a  DATABASE verb..*
252c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
252d0 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72 75 6e 63 61  e_control_trunca
252e0 74 65 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  te_test(.  Clien
252f0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
25300 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
25310 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
25320 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
25330 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
25340 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25350 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25360 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25370 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25380 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
253a0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
253b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
253c0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
253d0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
253e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
253f0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20  ;.  int flags;. 
25400 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69 66   int rc;.  .  if
25410 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
25420 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25430 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
25440 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
25450 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
25470 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
25480 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
25490 20 44 42 20 46 4c 41 47 53 22 2c 20 30 29 3b 0a   DB FLAGS", 0);.
254a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
254b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
254c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
254d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
254e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
254f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
25510 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
25520 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
25530 62 6a 76 5b 32 5d 2c 20 26 66 6c 61 67 73 29 20  bjv[2], &flags) 
25540 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
25550 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
25560 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
25570 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
25580 4c 2c 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  L, SQLITE_TRUNCA
25590 54 45 5f 44 41 54 41 42 41 53 45 2c 20 26 66 6c  TE_DATABASE, &fl
255a0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
255b0 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  { .    Tcl_SetOb
255c0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
255d0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
255e0 29 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e 20  )); .    return 
255f0 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a  TCL_ERROR; .  }.
25600 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25610 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
25620 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
25630 6f 6c 5f 72 65 70 6c 61 63 65 5f 74 65 73 74 20  ol_replace_test 
25640 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  DB.**.** This TC
25650 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
25660 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
25670 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
25680 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
25690 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
256a0 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
256b0 45 5f 52 45 50 4c 41 43 45 5f 44 41 54 41 42 41  E_REPLACE_DATABA
256c0 53 45 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74  SE verb..*/.stat
256d0 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
256e0 72 6f 6c 5f 72 65 70 6c 61 63 65 5f 74 65 73 74  rol_replace_test
256f0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
25700 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
25710 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
25720 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
25730 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25740 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25750 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25760 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25770 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
25780 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
257a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
257b0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
257c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
257d0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
257e0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
257f0 6c 69 74 65 33 20 2a 73 72 63 5f 64 62 3b 0a 20  lite3 *src_db;. 
25800 20 73 71 6c 69 74 65 33 20 2a 64 73 74 5f 64 62   sqlite3 *dst_db
25810 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20  ;.  int rc;.  . 
25820 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
25830 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
25840 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
25850 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
25860 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25880 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
25890 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
258a0 2c 20 22 20 44 53 54 5f 44 42 20 53 52 43 5f 44  , " DST_DB SRC_D
258b0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
258c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
258d0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
258e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
258f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
25900 31 5d 29 2c 20 26 64 73 74 5f 64 62 29 20 29 7b  1]), &dst_db) ){
25910 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
25920 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
25930 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
25940 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
25950 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 73  ing(objv[2]), &s
25960 72 63 5f 64 62 29 20 29 7b 0a 20 20 20 20 72 65  rc_db) ){.    re
25970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25980 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
25990 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
259a0 64 73 74 5f 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  dst_db, NULL, SQ
259b0 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f 44 41 54  LITE_REPLACE_DAT
259c0 41 42 41 53 45 2c 20 73 72 63 5f 64 62 29 3b 0a  ABASE, src_db);.
259d0 20 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20    if( rc ){ .   
259e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
259f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
25a00 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20  wIntObj(rc)); . 
25a10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
25a20 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  ROR; .  }.  retu
25a30 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 23  rn TCL_OK;  .}.#
25a40 65 6e 64 69 66 20 2f 2a 20 5f 5f 41 50 50 4c 45  endif /* __APPLE
25a50 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  __ */../*.** tcl
25a60 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
25a70 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
25a80 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  st DB DBNAME SIZ
25a90 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
25aa0 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
25ab0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
25ac0 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
25ad0 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
25ae0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
25af0 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
25b00 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
25b10 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  LE and.** SQLITE
25b20 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
25b30 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61  LE verbs..*/.sta
25b40 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
25b50 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
25b60 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
25b70 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25b80 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25b90 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25ba0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25bb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25bc0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25bd0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25be0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25bf0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25c00 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25c10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25c20 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25c30 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25c40 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25c50 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25c60 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69   /* New chunk si
25c90 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  ze */.  char *zD
25ca0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
25cb0 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
25cc0 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
25cd0 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71  p" etc.) */.  sq
25ce0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d00 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
25d10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f        /* file_co
25d40 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63  ntrol() return c
25d50 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ode */..  if( ob
25d60 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
25d70 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
25d80 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
25d90 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29  DB DBNAME SIZE")
25da0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
25db0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
25dc0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
25dd0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
25de0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
25df0 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
25e00 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
25e10 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
25e20 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65  Size).  ){.   re
25e30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25e40 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
25e50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
25e60 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d  ]);.  if( zDb[0]
25e70 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e  =='\0' ) zDb = N
25e80 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
25e90 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
25ea0 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
25eb0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
25ec0 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  ZE, (void *)&nSi
25ed0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
25ee0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
25ef0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
25f00 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
25f10 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
25f20 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
25f30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25f40 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
25f50 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
25f60 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73    file_control_s
25f70 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20  izehint_test DB 
25f80 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a  DBNAME SIZE.**.*
25f90 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
25fa0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
25fb0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
25fc0 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77   interface .** w
25fd0 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ith SQLITE_FCNTL
25fe0 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74  _SIZE_HINT.*/.st
25ff0 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
26000 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
26010 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
26020 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
26030 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
26040 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26050 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26060 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26070 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26080 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26090 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
260a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
260b0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
260c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
260d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
260e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
260f0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
26100 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26110 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69   Tcl_WideInt nSi
26120 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
26130 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20   /* Hinted size 
26140 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20       /* Db name 
26170 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
26180 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74  etc.) */.  sqlit
26190 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
261a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
261b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
261c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72     /* file_contr
261f0 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  ol() return code
26200 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
26210 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
26220 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
26230 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
26240 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20  DBNAME SIZE");. 
26250 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26260 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
26270 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
26280 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
26290 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
262a0 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57   .   || Tcl_GetW
262b0 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
262c0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
262d0 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72  nSize).  ){.   r
262e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
262f0 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c  .  }.  zDb = Tcl
26300 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
26310 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30  2]);.  if( zDb[0
26320 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20  ]=='\0' ) zDb = 
26330 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71  NULL;..  rc = sq
26340 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
26350 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  ol(db, zDb, SQLI
26360 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
26370 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  NT, (void *)&nSi
26380 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
26390 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
263a0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
263b0 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
263c0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
263d0 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
263e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
263f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
26400 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
26410 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
26420 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42  ockproxy_test DB
26430 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   PWD.**.** This 
26440 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
26450 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
26460 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
26470 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
26480 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
26490 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
264a0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
264b0 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c  YFILE and.** SQL
264c0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
264d0 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a  YFILE verbs..*/.
264e0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
264f0 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78  control_lockprox
26500 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  y_test(.  Client
26510 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
26520 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
26530 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
26540 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
26550 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26560 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
26570 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
26580 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
26590 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
265a0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
265b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
265c0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
265d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
265e0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
265f0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
26600 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
26610 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
26620 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
26630 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
26640 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
26650 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
26660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26670 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
26680 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
26690 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57 44 22  ], 0), " DB PWD"
266a0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
266b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
266c0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
266d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
266e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
266f0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65  ), &db) ){.   re
26700 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26710 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69    }.  .#if !defi
26720 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
26730 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29  E_LOCKING_STYLE)
26740 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f  .#  if defined(_
26750 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64  _APPLE__).#    d
26760 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
26770 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
26780 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  E 1.#  else.#   
26790 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
267a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
267b0 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23  YLE 0.#  endif.#
267c0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
267d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
267e0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
267f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a  (__APPLE__).  {.
26800 20 20 20 20 63 68 61 72 20 2a 74 65 73 74 50 61      char *testPa
26810 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  th;.    int rc;.
26820 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20      int nPwd;.  
26830 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
26840 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f  wd;.    char pro
26850 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20  xyPath[400];.   
26860 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c   .    zPwd = Tcl
26870 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
26880 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64  j(objv[2], &nPwd
26890 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f  );.    if( sizeo
268a0 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77  f(proxyPath)<nPw
268b0 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63  d+20 ){.      Tc
268c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
268d0 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20  nterp, "PWD too 
268e0 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b  big", (void*)0);
268f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
26900 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
26910 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
26920 6e 74 66 28 73 69 7a 65 6f 66 28 70 72 6f 78 79  ntf(sizeof(proxy
26930 50 61 74 68 29 2c 20 70 72 6f 78 79 50 61 74 68  Path), proxyPath
26940 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f 78 79  , "%s/test.proxy
26950 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20 72 63  ", zPwd);.    rc
26960 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
26970 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
26980 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
26990 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78  KPROXYFILE, prox
269a0 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  yPath);.    if( 
269b0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
269c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
269d0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
269e0 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 20 20  bj(rc)); .      
269f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
26a10 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
26a20 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
26a30 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
26a40 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73 74 50  ROXYFILE, &testP
26a50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 73 74  ath);.    if( st
26a60 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74 68 2c  rncmp(proxyPath,
26a70 74 65 73 74 50 61 74 68 2c 31 31 29 20 29 7b 0a  testPath,11) ){.
26a80 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
26a90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
26aa0 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20  Lock proxy file 
26ab0 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  did not match th
26ac0 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ae0 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79 20 61     "previously a
26af0 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22 2c 20  ssigned value", 
26b00 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
26b10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
26b20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
26b30 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
26b40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
26b50 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
26b60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
26b70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
26b80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26b90 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
26ba0 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
26bb0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
26bc0 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  E, proxyPath);. 
26bd0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
26be0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
26bf0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
26c00 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
26c10 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
26c20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
26c30 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
26c40 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23  n TCL_OK;  .}..#
26c50 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
26c60 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61  #include <sys/pa
26c70 72 61 6d 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ram.h>.#include 
26c80 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 69  <sys/mount.h>.#i
26c90 6e 63 6c 75 64 65 20 3c 73 79 73 2f 65 72 72 6e  nclude <sys/errn
26ca0 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o.h>.#endif../*.
26cb0 20 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 70 61   ** tclcmd:   pa
26cc0 74 68 5f 69 73 5f 6c 6f 63 61 6c 20 50 57 44 0a  th_is_local PWD.
26cd0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
26ce0 61 74 68 5f 69 73 5f 6c 6f 63 61 6c 28 0a 20 20  ath_is_local(.  
26cf0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
26d00 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
26d10 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
26d20 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
26d30 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
26d40 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
26d50 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
26d60 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
26d70 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
26d80 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
26d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26da0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
26db0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
26dc0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
26dd0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
26de0 73 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 5f  s */.){.#ifdef _
26df0 5f 41 50 50 4c 45 5f 5f 0a 20 20 63 6f 6e 73 74  _APPLE__.  const
26e00 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20   char *zPath;.  
26e10 69 6e 74 20 6e 50 61 74 68 3b 0a 20 20 73 74 72  int nPath;.  str
26e20 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
26e30 6f 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  o;.  .  if( objc
26e40 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
26e50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
26e60 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
26e70 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
26e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26e90 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
26ea0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
26eb0 5b 30 5d 2c 20 30 29 2c 20 22 20 50 41 54 48 22  [0], 0), " PATH"
26ec0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
26ed0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
26ee0 20 20 7a 50 61 74 68 20 3d 20 54 63 6c 5f 47 65    zPath = Tcl_Ge
26ef0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
26f00 62 6a 76 5b 31 5d 2c 20 26 6e 50 61 74 68 29 3b  bjv[1], &nPath);
26f10 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50  .  if( statfs(zP
26f20 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
26f30 20 2d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 65   -1 ){.    int e
26f40 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
26f50 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
26f60 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 20  (interp, "Error 
26f70 63 61 6c 6c 69 6e 67 20 73 74 61 74 66 73 20 6f  calling statfs o
26f80 6e 20 70 61 74 68 22 2c 0a 20 20 20 20 20 20 20  n path",.       
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
26fa0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 65 72 72 29  l_NewIntObj(err)
26fb0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
26fc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
26fd0 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
26fe0 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 20 29  lags&MNT_LOCAL )
26ff0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
27000 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
27010 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 31 29 29  cl_NewIntObj(1))
27020 3b 20 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  ; .  } else {.  
27030 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
27040 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
27050 65 77 49 6e 74 4f 62 6a 28 30 29 29 3b 20 0a 20  ewIntObj(0)); . 
27060 20 7d 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53   }.#else.  Tcl_S
27070 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
27080 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
27090 6a 28 31 29 29 3b 20 0a 23 65 6e 64 69 66 0a 20  j(1)); .#endif. 
270a0 20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f   .  return TCL_O
270b0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 74  K;  .}../*. ** t
270c0 63 6c 63 6d 64 3a 20 20 20 70 61 74 68 5f 69 73  clcmd:   path_is
270d0 5f 64 6f 73 20 50 57 44 0a 20 2a 2f 0a 73 74 61  _dos PWD. */.sta
270e0 74 69 63 20 69 6e 74 20 70 61 74 68 5f 69 73 5f  tic int path_is_
270f0 64 6f 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  dos(.  ClientDat
27100 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
27110 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
27120 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
27130 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
27140 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
27150 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
27160 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
27170 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
27180 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
27190 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
271a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
271b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
271c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
271d0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
271e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 23  rguments */.){.#
271f0 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
27200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
27210 61 74 68 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68  ath;.  int nPath
27220 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
27230 73 20 66 73 49 6e 66 6f 3b 0a 20 20 0a 20 20 69  s fsInfo;.  .  i
27240 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
27250 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
27260 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
27270 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
27280 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
272a0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
272b0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
272c0 22 20 50 41 54 48 22 2c 20 30 29 3b 0a 20 20 20  " PATH", 0);.   
272d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
272e0 52 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 68 20 3d  R;.  }.  zPath =
272f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
27300 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26  omObj(objv[1], &
27310 6e 50 61 74 68 29 3b 0a 20 20 69 66 28 20 73 74  nPath);.  if( st
27320 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
27330 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
27340 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
27350 6f 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  o;.    Tcl_Appen
27360 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
27370 22 45 72 72 6f 72 20 63 61 6c 6c 69 6e 67 20 73  "Error calling s
27380 74 61 74 66 73 20 6f 6e 20 70 61 74 68 22 2c 0a  tatfs on path",.
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273a0 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
273b0 62 6a 28 65 72 72 29 2c 20 30 29 3b 0a 20 20 20  bj(err), 0);.   
273c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
273d0 52 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  R;.  }.  if (0 =
273e0 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73  = strncmp("msdos
273f0 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
27400 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
27410 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
27420 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
27430 65 77 49 6e 74 4f 62 6a 28 31 29 29 3b 20 0a 20  ewIntObj(1)); . 
27440 20 7d 20 65 6c 73 65 20 69 66 20 28 30 20 3d 3d   } else if (0 ==
27450 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22   strncmp("exfat"
27460 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
27470 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20  ename, 5)) {.   
27480 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
27490 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
274a0 77 49 6e 74 4f 62 6a 28 31 29 29 3b 20 0a 20 20  wIntObj(1)); .  
274b0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 54 63 6c  } else {.    Tcl
274c0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
274d0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
274e0 4f 62 6a 28 30 29 29 3b 20 0a 20 20 7d 0a 23 65  Obj(0)); .  }.#e
274f0 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  lse.  Tcl_SetObj
27500 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
27510 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 30 29 29  cl_NewIntObj(0))
27520 3b 20 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72  ; .#endif.  .  r
27530 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
27540 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
27550 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  _WIN./*.** tclcm
27560 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
27570 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
27580 20 44 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c   DB  NRETRY  DEL
27590 41 59 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  AY.**.** This TC
275a0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
275b0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
275c0 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
275d0 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51  e with.** the SQ
275e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
275f0 5f 41 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65  _AV_RETRY opcode
27600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27610 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
27620 33 32 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43  32_av_retry(.  C
27630 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
27640 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
27650 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
27660 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
27670 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
27680 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27690 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
276a0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
276b0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
276c0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
276d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
276e0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
276f0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
27700 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
27710 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
27720 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27730 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
27740 20 20 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68    int a[2];.  ch
27750 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  ar z[100];..  if
27760 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
27770 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
27780 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
27790 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
277a0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
277b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
277c0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
277d0 2c 20 22 20 44 42 20 4e 52 45 54 52 59 20 44 45  , " DB NRETRY DE
277e0 4c 41 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LAY", 0);.    re
277f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
27800 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
27810 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
27820 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
27830 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
27840 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27850 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
27860 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
27870 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
27880 2c 20 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72  , &a[0]) ) retur
27890 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
278a0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
278b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
278c0 76 5b 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72  v[3], &a[1]) ) r
278d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
278e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
278f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
27900 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43   NULL, SQLITE_FC
27910 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54  NTL_WIN32_AV_RET
27920 52 59 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20  RY, (void*)a);. 
27930 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
27940 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
27950 22 25 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20  "%d %d %d", rc, 
27960 61 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54  a[0], a[1]);.  T
27970 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
27980 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72  interp, z, (char
27990 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
279a0 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  CL_OK;  .}../*.*
279b0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
279c0 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73  _control_win32_s
279d0 65 74 5f 68 61 6e 64 6c 65 20 44 42 20 48 41 4e  et_handle DB HAN
279e0 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  DLE.**.** This T
279f0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
27a00 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
27a10 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
27a20 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
27a30 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
27a40 32 5f 53 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63  2_SET_HANDLE opc
27a50 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
27a60 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
27a70 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
27a80 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
27a90 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
27aa0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
27ab0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
27ac0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
27ad0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
27ae0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
27af0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
27b00 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
27b10 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27b30 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
27b40 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
27b50 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
27b60 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
27b70 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
27b80 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
27b90 20 72 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46   rc;.  HANDLE hF
27ba0 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68  ile = NULL;.  ch
27bb0 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  ar z[100];..  if
27bc0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
27bd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
27be0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
27bf0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
27c00 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
27c10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
27c20 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
27c30 2c 20 22 20 44 42 20 48 41 4e 44 4c 45 22 2c 20  , " DB HANDLE", 
27c40 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
27c50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27c60 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
27c70 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
27c80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
27c90 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
27ca0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27cb0 20 7d 0a 20 20 69 66 28 20 67 65 74 57 69 6e 33   }.  if( getWin3
27cc0 32 48 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20  2Handle(interp, 
27cd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
27ce0 6a 76 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29 20  jv[2]), &hFile) 
27cf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
27d00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
27d10 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
27d20 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
27d30 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  L, SQLITE_FCNTL_
27d40 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45  WIN32_SET_HANDLE
27d50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
27d70 6f 69 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20  oid*)&hFile);.  
27d80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
27d90 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
27da0 25 64 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69  %d %p", rc, (voi
27db0 64 2a 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c  d*)hFile);.  Tcl
27dc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
27dd0 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
27de0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
27df0 5f 4f 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a  _OK;  .}.#endif.
27e00 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
27e10 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65   file_control_pe
27e20 72 73 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52  rsist_wal DB PER
27e30 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20  SIST-FLAG.**.** 
27e40 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
27e50 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
27e60 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
27e70 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
27e80 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
27e90 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70  L_PERSIST_WAL op
27ea0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
27eb0 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
27ec0 5f 70 65 72 73 69 73 74 5f 77 61 6c 28 0a 20 20  _persist_wal(.  
27ed0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
27ee0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
27ef0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
27f00 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
27f10 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
27f20 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27f30 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27f40 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27f50 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27f60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27f80 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27f90 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27fa0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
27fb0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
27fc0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
27fd0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
27fe0 0a 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 3b  .  int bPersist;
27ff0 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
28000 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
28010 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
28020 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
28030 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
28040 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
28050 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
28060 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
28070 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47  ], 0), " DB FLAG
28080 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
28090 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
280a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
280b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
280c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
280d0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
280e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
280f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
28100 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
28110 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
28120 62 50 65 72 73 69 73 74 29 20 29 20 72 65 74 75  bPersist) ) retu
28130 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28140 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
28150 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
28160 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
28170 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 76  _PERSIST_WAL, (v
28180 6f 69 64 2a 29 26 62 50 65 72 73 69 73 74 29 3b  oid*)&bPersist);
28190 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
281a0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
281b0 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62  , "%d %d", rc, b
281c0 50 65 72 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f  Persist);.  Tcl_
281d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
281e0 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
281f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
28200 4f 4b 3b 20 20 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  OK;  .}./*.** tc
28210 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
28220 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f  trol_powersafe_o
28230 76 65 72 77 72 69 74 65 20 44 42 20 50 53 4f 57  verwrite DB PSOW
28240 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73  -FLAG.**.** This
28250 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
28260 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
28270 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
28280 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65  face with.** the
28290 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
282a0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
282b0 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  E opcode..*/.sta
282c0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
282d0 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f  trol_powersafe_o
282e0 76 65 72 77 72 69 74 65 28 0a 20 20 43 6c 69 65  verwrite(.  Clie
282f0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28300 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
28310 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
28320 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
28330 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28340 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28350 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
28360 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
28370 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
28380 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
28390 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
283a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
283b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
283c0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
283d0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
283e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
283f0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
28400 6e 74 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31  nt b;.  char z[1
28410 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
28420 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
28430 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28440 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
28450 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
28460 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
28470 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
28480 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
28490 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20   FLAG", 0);.    
284a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
284b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
284c0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
284d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
284e0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
284f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28500 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28510 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
28520 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28530 32 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  2], &b) ) return
28540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
28550 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
28560 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c  control(db,NULL,
28570 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
28580 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
28590 2c 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73  ,(void*)&b);.  s
285a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
285b0 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
285c0 64 20 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20  d %d", rc, b);. 
285d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
285e0 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68  t(interp, z, (ch
285f0 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
28600 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f   TCL_OK;  .}.../
28610 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
28620 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
28630 61 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a  ame DB ?AUXDB?.*
28640 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
28650 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
28660 62 65 73 20 74 68 65 20 73 74 61 63 6b 20 6f 66  bes the stack of
28670 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   VFSes..*/.stati
28680 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
28690 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43 6c  ol_vfsname(.  Cl
286a0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
286b0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
286c0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
286d0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
286e0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
286f0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
28700 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
28710 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
28720 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
28730 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
28740 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28750 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
28760 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
28770 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
28780 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
28790 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
287a0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
287b0 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61  r *zDbName = "ma
287c0 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56 66  in";.  char *zVf
287d0 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  sName = 0;..  if
287e0 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
287f0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
28800 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
28810 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
28820 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
28830 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
28840 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
28850 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
28860 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a  B ?AUXDB?", 0);.
28870 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28880 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28890 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
288a0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
288b0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
288c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
288d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
288e0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
288f0 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63      zDbName = Tc
28900 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
28910 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [2]);.  }.  sqli
28920 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
28930 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51  (db, zDbName, SQ
28940 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
28950 4d 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73 4e  ME,(void*)&zVfsN
28960 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ame);.  Tcl_Appe
28970 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
28980 20 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68 61 72   zVfsName, (char
28990 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *)0);.  sqlite3_
289a0 66 72 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a  free(zVfsName);.
289b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
289c0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
289d0 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
289e0 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 20  ol_tempfilename 
289f0 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a  DB ?AUXDB?.**.**
28a00 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
28a10 20 74 68 61 74 20 69 73 20 61 20 74 65 6d 70 6f   that is a tempo
28a20 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f  rary filename.*/
28a30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
28a40 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c  _control_tempfil
28a50 65 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44  ename(.  ClientD
28a60 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
28a70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
28a80 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
28a90 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
28aa0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
28ab0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
28ac0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
28ad0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
28ae0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
28af0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
28b00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28b10 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
28b20 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28b30 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
28b40 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
28b50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
28b60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
28b70 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  bName = "main";.
28b80 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
28b90 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
28ba0 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
28bb0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
28bc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
28bd0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
28be0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
28bf0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
28c00 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
28c10 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44  , 0), " DB ?AUXD
28c20 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  B?", 0);.    ret
28c30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28c40 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
28c50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
28c60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
28c70 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
28c80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28c90 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
28ca0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62  jc==3 ){.    zDb
28cb0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
28cc0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
28cd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   }.  sqlite3_fil
28ce0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
28cf0 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bName, SQLITE_FC
28d00 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
28d10 2c 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d 65  , (void*)&zTName
28d20 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
28d30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 54  esult(interp, zT
28d40 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
28d50 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
28d60 7a 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  zTName);.  retur
28d70 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a  n TCL_OK;  .}...
28d80 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
28d90 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74  sqlite3_vfs_list
28da0 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20  .**.**   Return 
28db0 61 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61  a tcl list conta
28dc0 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ining the names 
28dd0 6f 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65  of all registere
28de0 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74  d vfs's..*/.stat
28df0 69 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28  ic int vfs_list(
28e00 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
28e10 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
28e20 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
28e30 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
28e40 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
28e50 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
28e60 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
28e70 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
28e80 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
28e90 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28eb0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
28ec0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
28ed0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
28ee0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
28ef0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
28f00 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
28f10 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
28f20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
28f30 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
28f40 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
28f50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
28f60 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
28f70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28f80 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73  ;.  }.  for(pVfs
28f90 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
28fa0 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73  d(0); pVfs; pVfs
28fb0 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pVfs->pNext){. 
28fc0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
28fd0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
28fe0 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
28ff0 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d  wStringObj(pVfs-
29000 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  >zName, -1));.  
29010 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
29020 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
29030 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
29040 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
29050 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65  tclcmd:   sqlite
29060 33 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41  3_limit DB ID VA
29070 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LUE.**.** This T
29080 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
29090 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  the sqlite3_limi
290a0 74 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  t interface and.
290b0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
290c0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
290d0 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74   the same..*/.st
290e0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
290f0 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  mit(.  ClientDat
29100 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
29110 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
29120 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
29130 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
29140 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
29150 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
29160 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
29170 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
29180 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
29190 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
291a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
291b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
291c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
291d0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
291e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
291f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
29200 69 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63  int rc;.  static
29210 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
29220 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
29230 3b 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20  ;.     int id;. 
29240 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20   } aId[] = {.   
29250 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
29260 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20  _LENGTH",       
29270 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
29280 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  MIT_LENGTH      
29290 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
292a0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
292b0 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  SQL_LENGTH",    
292c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
292d0 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20  IT_SQL_LENGTH   
292e0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
292f0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43   "SQLITE_LIMIT_C
29300 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20  OLUMN",         
29310 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
29320 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20  T_COLUMN        
29330 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
29340 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  "SQLITE_LIMIT_EX
29350 50 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20  PR_DEPTH",      
29360 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
29370 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20  _EXPR_DEPTH     
29380 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
29390 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
293a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20  POUND_SELECT",  
293b0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
293c0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
293d0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
293e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
293f0 5f 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20 20  _OP",           
29400 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
29410 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20  DBE_OP          
29420 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
29430 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
29440 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20  ION_ARG",       
29450 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55   SQLITE_LIMIT_FU
29460 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20  NCTION_ARG      
29470 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
29480 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
29490 45 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ED",            
294a0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
294b0 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20  ACHED           
294c0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
294d0 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
294e0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53  TTERN_LENGTH", S
294f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
29500 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
29510 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
29520 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
29530 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51  _NUMBER",     SQ
29540 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
29550 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20  BLE_NUMBER      
29560 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
29570 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
29580 45 50 54 48 22 2c 20 20 20 20 20 20 20 53 51 4c  EPTH",       SQL
29590 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
295a0 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 7d  R_DEPTH        }
295b0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
295c0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
295d0 45 41 44 53 22 2c 20 20 20 20 20 20 53 51 4c 49  EADS",      SQLI
295e0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
295f0 54 48 52 45 41 44 53 20 20 20 20 20 20 20 7d 2c  THREADS       },
29600 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74  .    .    /* Out
29610 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74 20 63   of range test c
29620 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53  ases */.    { "S
29630 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53  QLITE_LIMIT_TOOS
29640 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20  MALL",          
29650 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20    -1,           
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
29680 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49  LITE_LIMIT_TOOBI
29690 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  G",             
296a0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
296b0 52 4b 45 52 5f 54 48 52 45 41 44 53 2b 31 20 20  RKER_THREADS+1  
296c0 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74     },.  };.  int
296d0 20 69 2c 20 69 64 20 3d 20 30 3b 0a 20 20 69 6e   i, id = 0;.  in
296e0 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  t val;.  const c
296f0 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28  har *zId;..  if(
29700 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
29710 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29720 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
29730 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
29740 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
29750 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
29760 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
29770 20 22 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c   " DB ID VALUE",
29780 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
29790 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
297a0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
297b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
297c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
297d0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
297e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64  TCL_ERROR;.  zId
297f0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
29800 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72  (objv[2]);.  for
29810 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
29820 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30  Id)/sizeof(aId[0
29830 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
29840 28 20 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49  ( strcmp(zId, aI
29850 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  d[i].zName)==0 )
29860 7b 0a 20 20 20 20 20 20 69 64 20 3d 20 61 49 64  {.      id = aId
29870 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72  [i].id;.      br
29880 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
29890 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
298a0 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30  Id)/sizeof(aId[0
298b0 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  ]) ){.    Tcl_Ap
298c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
298d0 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69  p, "unknown limi
298e0 74 20 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20  t type: ", zId, 
298f0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
29900 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29910 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
29920 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
29930 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
29940 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
29950 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
29960 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c  qlite3_limit(db,
29970 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c   id, val);.  Tcl
29980 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
29990 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
299a0 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75  Obj(rc));.  retu
299b0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
299c0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
299d0 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  ave_prng_state.*
299e0 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74  *.** Save the st
299f0 61 74 65 20 6f 66 20 74 68 65 20 70 73 65 75 64  ate of the pseud
29a00 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  o-random number 
29a10 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74  generator..** At
29a20 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
29a30 76 65 72 69 66 79 20 74 68 61 74 20 73 71 6c 69  verify that sqli
29a40 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
29a50 20 77 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e   works even when
29a60 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
29a70 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  an out-of-range 
29a80 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
29a90 63 20 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f  c int save_prng_
29aa0 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
29ab0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
29ac0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
29ad0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
29ae0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
29af0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29b00 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
29b10 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
29b20 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
29b30 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
29b40 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
29b50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29b60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
29b70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
29b80 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
29b90 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
29ba0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
29bb0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
29bc0 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74  (9999);.  assert
29bd0 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20  ( rc==0 );.  rc 
29be0 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
29bf0 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73  ontrol(-1);.  as
29c00 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
29c10 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
29c20 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
29c30 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29  TCTRL_PRNG_SAVE)
29c40 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
29c50 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
29c60 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67  d:  restore_prng
29c70 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63  _state.*/.static
29c80 20 69 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e   int restore_prn
29c90 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e  g_state(.  Clien
29ca0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
29cb0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
29cc0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
29cd0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
29ce0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
29cf0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
29d00 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
29d10 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
29d20 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
29d30 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
29d40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29d50 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
29d60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
29d70 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
29d80 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
29d90 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73  ){.  sqlite3_tes
29da0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
29db0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
29dc0 45 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72  ESTORE);.  retur
29dd0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
29de0 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74  * tclcmd:  reset
29df0 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73  _prng_state.*/.s
29e00 74 61 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f  tatic int reset_
29e10 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
29e20 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
29e30 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
29e40 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
29e50 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
29e60 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
29e70 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
29e80 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
29e90 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
29ea0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
29eb0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
29ec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29ed0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
29ee0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
29ef0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
29f00 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
29f10 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
29f20 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
29f30 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
29f40 47 5f 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75  G_RESET);.  retu
29f50 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
29f60 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74  .** tclcmd:  dat
29f70 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72  abase_may_be_cor
29f80 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  rupt.**.** Indic
29f90 61 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73  ate that databas
29fa0 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 62 65  e files might be
29fb0 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 74   corrupt.  In ot
29fc0 68 65 72 20 77 6f 72 64 73 2c 20 73 65 74 20 74  her words, set t
29fd0 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 73 74 61  he normal.** sta
29fe0 74 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e  te of operation.
29ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
2a000 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
2a010 6f 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74  orrupt(.  Client
2a020 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2a030 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2a040 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2a050 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2a060 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a070 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2a080 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2a090 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2a0a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2a0b0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2a0c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a0d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2a0e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2a0f0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2a100 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2a110 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
2a120 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2a130 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
2a140 4f 52 52 55 50 54 2c 20 30 29 3b 0a 20 20 72 65  ORRUPT, 0);.  re
2a150 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
2a160 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61  *.** tclcmd:  da
2a170 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2a180 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  rupt.**.** Indic
2a190 61 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73  ate that databas
2a1a0 65 20 66 69 6c 65 73 20 61 72 65 20 61 6c 77 61  e files are alwa
2a1b0 79 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  ys well-formed. 
2a1c0 20 54 68 69 73 20 65 6e 61 62 6c 65 73 20 65 78   This enables ex
2a1d0 74 72 61 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  tra assert().** 
2a1e0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
2a1f0 74 65 73 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20  test conditions 
2a200 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20  that are always 
2a210 74 72 75 65 20 66 6f 72 20 77 65 6c 6c 2d 66 6f  true for well-fo
2a220 72 6d 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a  rmed databases..
2a230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
2a240 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2a250 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  rupt(.  ClientDa
2a260 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2a270 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2a280 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2a290 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2a2a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a2b0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2a2c0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2a2d0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2a2e0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2a2f0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2a300 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2a310 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2a320 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2a330 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2a340 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2a350 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2a360 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2a370 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
2a380 52 55 50 54 2c 20 31 29 3b 0a 20 20 72 65 74 75  RUPT, 1);.  retu
2a390 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2a3a0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61  .** tclcmd:  pca
2a3b0 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61  che_stats.*/.sta
2a3c0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61  tic int test_pca
2a3d0 63 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69  che_stats(.  Cli
2a3e0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2a3f0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
2a400 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
2a410 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
2a420 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2a430 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2a440 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2a450 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2a460 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2a470 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2a480 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a490 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2a4a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2a4b0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2a4c0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2a4d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b  /.){.  int nMin;
2a4e0 0a 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69  .  int nMax;.  i
2a4f0 6e 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69  nt nCurrent;.  i
2a500 6e 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a  nt nRecyclable;.
2a510 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
2a520 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ..  sqlite3Pcach
2a530 65 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74  eStats(&nCurrent
2a540 2c 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20  , &nMax, &nMin, 
2a550 26 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a  &nRecyclable);..
2a560 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
2a570 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
2a580 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2a590 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2a5a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2a5b0 28 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29  ("current", -1))
2a5c0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2a5d0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2a5e0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
2a5f0 65 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e  ewIntObj(nCurren
2a600 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  t));.  Tcl_ListO
2a610 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2a620 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
2a630 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2a640 6d 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  max", -1));.  Tc
2a650 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2a660 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2a670 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
2a680 62 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c  bj(nMax));.  Tcl
2a690 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2a6a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2a6b0 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
2a6c0 67 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29  gObj("min", -1))
2a6d0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2a6e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2a6f0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
2a700 65 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b  ewIntObj(nMin));
2a710 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2a720 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2a730 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
2a740 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79  wStringObj("recy
2a750 63 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20  clable", -1));. 
2a760 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2a770 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2a780 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
2a790 6e 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c  ntObj(nRecyclabl
2a7a0 65 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  e));..  Tcl_SetO
2a7b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2a7c0 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72   pRet);..  retur
2a7d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
2a7e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2a7f0 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a  E_UNLOCK_NOTIFY.
2a800 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
2a810 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63  _unlock_notify_c
2a820 62 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69  b(void **aArg, i
2a830 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20  nt nArg){.  int 
2a840 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ii;.  for(ii=0; 
2a850 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a  ii<nArg; ii++){.
2a860 20 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28      Tcl_EvalEx((
2a870 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72  Tcl_Interp *)aAr
2a880 67 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e  g[ii], "unlock_n
2a890 6f 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f  otify", -1, TCL_
2a8a0 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
2a8b0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
2a8c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
2a8d0 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a  CK_NOTIFY */../*
2a8e0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
2a8f0 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
2a900 66 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20  fy db.*/.#ifdef 
2a910 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
2a920 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
2a930 69 63 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f  ic int test_unlo
2a940 63 6b 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69  ck_notify(.  Cli
2a950 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2a960 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
2a970 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2a980 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2a990 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2a9a0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2a9b0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2a9c0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2a9d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a9e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2a9f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2aa00 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2aa10 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2aa20 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2aa30 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
2aa40 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
2aa50 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2aa60 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2aa70 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
2aa80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2aa90 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
2aaa0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2aab0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2aac0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2aad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
2aae0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
2aaf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  c = sqlite3_unlo
2ab00 63 6b 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65  ck_notify(db, te
2ab10 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
2ab20 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74  _cb, (void *)int
2ab30 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  erp);.  Tcl_SetR
2ab40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2ab50 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
2ab60 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
2ab70 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
2ab80 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
2ab90 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
2aba0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
2abb0 6f 69 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a  oint db ?NAME?.*
2abc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
2abd0 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
2abe0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2abf0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
2ac00 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
2ac10 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2ac20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2ac30 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2ac40 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2ac50 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ac70 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2ac80 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2ac90 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2aca0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2acb0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
2acc0 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73  ar *zDb = 0;.  s
2acd0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2ace0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
2acf0 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=3 && objc!=2 
2ad00 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2ad10 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2ad20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41  1, objv, "DB ?NA
2ad30 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ME?");.    retur
2ad40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2ad50 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
2ad60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2ad70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2ad80 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
2ad90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ada0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
2adb0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 20  c==3 ){.    zDb 
2adc0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2add0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  objv[2]);.  }.  
2ade0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c  rc = sqlite3_wal
2adf0 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
2ae00 7a 44 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  zDb);.  Tcl_SetR
2ae10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2ae20 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
2ae30 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
2ae40 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
2ae50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
2ae60 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77  lcmd:  sqlite3_w
2ae70 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2ae80 20 64 62 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a   db MODE ?NAME?.
2ae90 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  **.** This comma
2aea0 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 77 61 6c  nd calls the wal
2aeb0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
2aec0 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
2aed0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
2aee0 6d 6f 64 65 20 61 72 67 75 6d 65 6e 74 20 28 70  mode argument (p
2aef0 61 73 73 69 76 65 2c 20 66 75 6c 6c 20 6f 72 20  assive, full or 
2af00 72 65 73 74 61 72 74 29 2e 20 49 66 20 70 72 65  restart). If pre
2af10 73 65 6e 74 2c 20 74 68 65 20 64 61 74 61 62 61  sent, the databa
2af20 73 65 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20  se name.** NAME 
2af30 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
2af40 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2af50 20 74 6f 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69   to wal_checkpoi
2af60 6e 74 5f 76 32 28 29 2e 20 49 66 20 69 74 20 74  nt_v2(). If it t
2af70 68 65 0a 2a 2a 20 4e 41 4d 45 20 61 72 67 75 6d  he.** NAME argum
2af80 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
2af90 6e 74 2c 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  nt, a NULL point
2afa0 65 72 20 69 73 20 70 61 73 73 65 64 20 69 6e 73  er is passed ins
2afb0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tead..**.** If w
2afc0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2afd0 28 29 20 72 65 74 75 72 6e 73 20 61 6e 79 20 76  () returns any v
2afe0 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20  alue other than 
2aff0 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 0a 2a  SQLITE_BUSY or.*
2b000 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  * SQLITE_OK, the
2b010 6e 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72  n this command r
2b020 65 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52  eturns TCL_ERROR
2b030 2e 20 54 68 65 20 54 63 6c 20 72 65 73 75 6c 74  . The Tcl result
2b040 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68   is set.** to th
2b050 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2b060 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2b070 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2e 0a  lite3_errmsg()..
2b080 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
2b090 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65   this command re
2b0a0 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  turns a list of 
2b0b0 74 68 72 65 65 20 69 6e 74 65 67 65 72 73 2e 20  three integers. 
2b0c0 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
2b0d0 72 0a 2a 2a 20 69 73 20 31 20 69 66 20 53 51 4c  r.** is 1 if SQL
2b0e0 49 54 45 5f 42 55 53 59 20 77 61 73 20 72 65 74  ITE_BUSY was ret
2b0f0 75 72 6e 65 64 2c 20 6f 72 20 30 20 6f 74 68 65  urned, or 0 othe
2b100 72 77 69 73 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  rwise. The follo
2b110 77 69 6e 67 20 74 77 6f 20 69 6e 74 65 67 65 72  wing two integer
2b120 73 0a 2a 2a 20 61 72 65 20 74 68 65 20 76 61 6c  s.** are the val
2b130 75 65 73 20 72 65 74 75 72 6e 65 64 20 76 69 61  ues returned via
2b140 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
2b150 6d 65 74 65 72 73 20 62 79 20 77 61 6c 5f 63 68  meters by wal_ch
2b160 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 2d 0a  eckpoint_v2() -.
2b170 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
2b180 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
2b190 6f 67 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  og and the numbe
2b1a0 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
2b1b0 68 65 20 6c 6f 67 0a 2a 2a 20 74 68 61 74 20 68  he log.** that h
2b1c0 61 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f  ave been checkpo
2b1d0 69 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  inted..*/.static
2b1e0 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68   int test_wal_ch
2b1f0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 43  eckpoint_v2(.  C
2b200 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2b210 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
2b220 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2b230 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2b240 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2b250 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2b260 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2b270 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2b280 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b290 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2b2a0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2b2b0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2b2c0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2b2d0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
2b2e0 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  Db = 0;.  sqlite
2b2f0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
2b300 0a 0a 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a 20  ..  int eMode;. 
2b310 20 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35 35   int nLog = -555
2b320 3b 0a 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d 20  ;.  int nCkpt = 
2b330 2d 35 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  -555;.  Tcl_Obj 
2b340 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20  *pRet;..  const 
2b350 63 68 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d  char * aMode[] =
2b360 20 7b 20 22 70 61 73 73 69 76 65 22 2c 20 22 66   { "passive", "f
2b370 75 6c 6c 22 2c 20 22 72 65 73 74 61 72 74 22 2c  ull", "restart",
2b380 20 22 74 72 75 6e 63 61 74 65 22 2c 20 30 20 7d   "truncate", 0 }
2b390 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2b3a0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
2b3b0 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73  SSIVE==0 );.  as
2b3c0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
2b3d0 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20  CKPOINT_FULL==1 
2b3e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2b3f0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
2b400 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61  ESTART==2 );.  a
2b410 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
2b420 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
2b430 45 3d 3d 33 20 29 3b 0a 0a 20 20 69 66 28 20 6f  E==3 );..  if( o
2b440 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
2b450 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
2b460 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2b470 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4d  , 1, objv, "DB M
2b480 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  ODE ?NAME?");.  
2b490 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b4a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
2b4b0 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 44  bjc==4 ){.    zD
2b4c0 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
2b4d0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a  g(objv[3]);.  }.
2b4e0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2b4f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2b500 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2b510 29 2c 20 26 64 62 29 20 7c 7c 20 28 0a 20 20 20  ), &db) || (.   
2b520 20 20 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47     TCL_OK!=Tcl_G
2b530 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
2b540 6f 62 6a 76 5b 32 5d 2c 20 26 65 4d 6f 64 65 29  objv[2], &eMode)
2b550 0a 20 20 20 26 26 20 54 43 4c 5f 4f 4b 21 3d 54  .   && TCL_OK!=T
2b560 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
2b570 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2b580 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64 65  2], aMode, "mode
2b590 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a 20  ", 0, &eMode) . 
2b5a0 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   )){.    return 
2b5b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2b5c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
2b5d0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2b5e0 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c  (db, zDb, eMode,
2b5f0 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b   &nLog, &nCkpt);
2b600 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2b610 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
2b620 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 63  TE_BUSY ){.    c
2b630 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 43  onst char *zErrC
2b640 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 45 72 72  ode = sqlite3Err
2b650 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20 20 54 63  Name(rc);.    Tc
2b660 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2b670 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41  terp);.    Tcl_A
2b680 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2b690 72 70 2c 20 7a 45 72 72 43 6f 64 65 2c 20 22 20  rp, zErrCode, " 
2b6a0 2d 20 22 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  - ", (char *)sql
2b6b0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
2b6c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2b6d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2b6e0 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
2b6f0 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
2b700 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2b710 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2b720 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
2b730 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a  ==SQLITE_BUSY?1:
2b740 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  0));.  Tcl_ListO
2b750 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2b760 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
2b770 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67  l_NewIntObj(nLog
2b780 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
2b790 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2b7a0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
2b7b0 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74  _NewIntObj(nCkpt
2b7c0 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ));.  Tcl_SetObj
2b7d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
2b7e0 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
2b7f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2b800 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
2b810 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
2b820 6f 69 6e 74 20 64 62 20 56 41 4c 55 45 0a 2a 2f  oint db VALUE.*/
2b830 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2b840 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
2b850 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  int(.  ClientDat
2b860 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2b870 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2b880 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2b890 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2b8a0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2b8b0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2b8c0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2b8d0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2b8e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2b8f0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2b900 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2b910 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2b920 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2b930 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2b940 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 56  int rc;.  int iV
2b950 61 6c 3b 0a 0a 0a 20 20 69 66 28 20 6f 62 6a 63  al;...  if( objc
2b960 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
2b970 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2b980 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2b990 20 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65   VALUE");.    re
2b9a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2b9b0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
2b9c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2b9d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2b9e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20  jv[1]), &db) .  
2b9f0 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72   || Tcl_GetIntFr
2ba00 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d  omObj(0, objv[2]
2ba10 2c 20 26 69 56 61 6c 29 0a 20 20 29 7b 0a 20 20  , &iVal).  ){.  
2ba20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2ba30 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OR;.  }..  rc = 
2ba40 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
2ba50 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69  checkpoint(db, i
2ba60 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  Val);.  Tcl_Rese
2ba70 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
2ba80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2ba90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
2baa0 74 20 63 68 61 72 20 2a 7a 45 72 72 43 6f 64 65  t char *zErrCode
2bab0 20 3d 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   = sqlite3ErrNam
2bac0 65 28 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 53  e(rc);.    Tcl_S
2bad0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2bae0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
2baf0 67 4f 62 6a 28 7a 45 72 72 43 6f 64 65 2c 20 2d  gObj(zErrCode, -
2bb00 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  1));.    return 
2bb10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2bb20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2bb30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
2bb40 64 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33  d:  test_sqlite3
2bb50 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f  _log ?SCRIPT?.*/
2bb60 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c  .static struct L
2bb70 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54  ogCallback {.  T
2bb80 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65  cl_Interp *pInte
2bb90 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
2bba0 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61  Obj;.} logcallba
2bbb0 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61  ck = {0, 0};.sta
2bbc0 74 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c  tic void xLogcal
2bbd0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73  lback(void *unus
2bbe0 65 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61  ed, int err, cha
2bbf0 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f  r *zMsg){.  Tcl_
2bc00 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f  Obj *pNew = Tcl_
2bc10 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67  DuplicateObj(log
2bc20 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a  callback.pObj);.
2bc30 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2bc40 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f  nt(pNew);.  Tcl_
2bc50 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2bc60 6d 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70  ment(.      0, p
2bc70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  New, Tcl_NewStri
2bc80 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
2bc90 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20  Name(err), -1). 
2bca0 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62   );.  Tcl_ListOb
2bcb0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
2bcc0 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53  , pNew, Tcl_NewS
2bcd0 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d  tringObj(zMsg, -
2bce0 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
2bcf0 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  bjEx(logcallback
2bd00 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20  .pInterp, pNew, 
2bd10 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c  TCL_EVAL_GLOBAL|
2bd20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
2bd30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
2bd40 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74  ount(pNew);.}.st
2bd50 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71  atic int test_sq
2bd60 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69  lite3_log(.  Cli
2bd70 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2bd80 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2bd90 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2bda0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2bdb0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2bdc0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2bdd0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2bde0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2bdf0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2be00 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2be10 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2be20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2be30 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62  s */.){.  if( ob
2be40 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc>2 ){.    Tcl_
2be50 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2be60 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
2be70 43 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74  CRIPT");.    ret
2be80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2be90 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c   }.  if( logcall
2bea0 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20  back.pObj ){.   
2beb0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2bec0 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f  t(logcallback.pO
2bed0 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  bj);.    logcall
2bee0 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20  back.pObj = 0;. 
2bef0 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70     logcallback.p
2bf00 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20  Interp = 0;.    
2bf10 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
2bf20 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47  QLITE_CONFIG_LOG
2bf30 2c 20 28 76 6f 69 64 2a 29 30 2c 20 28 76 6f 69  , (void*)0, (voi
2bf40 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  d*)0);.  }.  if(
2bf50 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c   objc>1 ){.    l
2bf60 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
2bf70 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54  = objv[1];.    T
2bf80 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2bf90 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
2bfa0 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  );.    logcallba
2bfb0 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e 74  ck.pInterp = int
2bfc0 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  erp;.    sqlite3
2bfd0 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
2bfe0 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63  ONFIG_LOG, xLogc
2bff0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
2c000 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
2c010 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2c020 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f  *     tcl_objpro
2c030 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41 52  c COMMANDNAME AR
2c040 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20  GS....**.** Run 
2c050 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 73  a TCL command us
2c060 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63 20  ing its objProc 
2c070 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72 6f  interface.  Thro
2c080 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a  w an error if.**
2c090 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73   the command has
2c0a0 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65   no objProc inte
2c0b0 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
2c0c0 20 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50 72 6f   int runAsObjPro
2c0d0 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  c(.  void * clie
2c0e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2c0f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2c100 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2c110 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2c120 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e  ].){.  Tcl_CmdIn
2c130 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66  fo cmdInfo;.  if
2c140 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20  ( objc<2 ){.    
2c150 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2c160 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2c170 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29  , "COMMAND ...")
2c180 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2c190 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2c1a0 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
2c1b0 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
2c1c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2c1d0 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
2c1e0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2c1f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2c200 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
2c210 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
2c220 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
2c230 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
2c240 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
2c250 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2c260 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a   if( cmdInfo.obj
2c270 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54  Proc==0 ){.    T
2c280 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2c290 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
2c2a0 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a   has no objProc:
2c2b0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54   ",.           T
2c2c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2c2d0 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29  v[1]), (char*)0)
2c2e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2c2f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
2c300 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a  turn cmdInfo.obj
2c310 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a  Proc(cmdInfo.obj
2c320 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65  ClientData, inte
2c330 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76  rp, objc-1, objv
2c340 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  +1);.}..#ifndef 
2c350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2c360 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e  AIN./*.** WARNIN
2c370 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  G: The following
2c380 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74   function, print
2c390 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
2c3a0 28 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a 2a  () is an exact.*
2c3b0 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c  * copy of exampl
2c3c0 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e  e code from eqp.
2c3d0 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49  in (eqp.html). I
2c3e0 66 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d  f this code is m
2c3f0 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e  odified,.** then
2c400 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
2c410 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74 6f  on copy needs to
2c420 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20   be modified as 
2c430 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  well..*/./*.** A
2c440 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69 73  rgument pStmt is
2c450 20 61 20 70 72 65 70 61 72 65 64 20 53 51 4c 20   a prepared SQL 
2c460 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
2c470 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65  function compile
2c480 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20  s.** an EXPLAIN 
2c490 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
2c4a0 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20  nd to report on 
2c4b0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
2c4c0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70  tement,.** and p
2c4d0 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72 74  rints the report
2c4e0 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e 67   to stdout using
2c4f0 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e   printf()..*/.in
2c500 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75  t printExplainQu
2c510 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f  eryPlan(sqlite3_
2c520 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  stmt *pStmt){.  
2c530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2c540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c550 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a  /* Input SQL */.
2c560 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e    char *zExplain
2c570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c580 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45 58    /* SQL with EX
2c590 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2c5a0 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20   prepended */.  
2c5b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45  sqlite3_stmt *pE
2c5c0 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20  xplain;         
2c5d0 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c  /* Compiled EXPL
2c5e0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
2c5f0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2c600 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2c610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c620 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2c630 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2c640 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20  v2() */..  zSql 
2c650 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
2c660 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  tmt);.  if( zSql
2c670 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2c680 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45  ITE_ERROR;..  zE
2c690 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33  xplain = sqlite3
2c6a0 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
2c6b0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22  N QUERY PLAN %s"
2c6c0 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a  , zSql);.  if( z
2c6d0 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74  Explain==0 ) ret
2c6e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2c6f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2c700 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71 6c  3_prepare_v2(sql
2c710 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
2c720 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c  Stmt), zExplain,
2c730 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
2c740 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
2c750 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ee(zExplain);.  
2c760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c770 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
2c780 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
2c790 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2c7a0 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20  p(pExplain) ){. 
2c7b0 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69 64     int iSelectid
2c7c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2c7d0 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
2c7e0 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72 64  0);.    int iOrd
2c7f0 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  er = sqlite3_col
2c800 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
2c810 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 46  , 1);.    int iF
2c820 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  rom = sqlite3_co
2c830 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
2c840 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74  n, 2);.    const
2c850 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d   char *zDetail =
2c860 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2c870 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2c880 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b  xt(pExplain, 3);
2c890 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 64  ..    printf("%d
2c8a0 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69 53   %d %d %s\n", iS
2c8b0 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72 2c  electid, iOrder,
2c8c0 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29   iFrom, zDetail)
2c8d0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2c8e0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2c8f0 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73  (pExplain);.}..s
2c900 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
2c910 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64  rint_eqp(.  void
2c920 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2c930 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2c940 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2c950 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2c960 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
2c970 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
2c980 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
2c990 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
2c9a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2c9b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2c9c0 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
2c9d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2c9e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2c9f0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
2ca00 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2ca10 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
2ca20 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
2ca30 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
2ca40 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72  printExplainQuer
2ca50 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20  yPlan(pStmt);.  
2ca60 2f 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65  /* This is neede
2ca70 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20  d on Windows so 
2ca80 74 68 61 74 20 61 20 74 65 73 74 20 63 61 73 65  that a test case
2ca90 20 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a   using this .  *
2caa0 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f  * function can o
2cab0 70 65 6e 20 61 20 72 65 61 64 20 70 69 70 65 20  pen a read pipe 
2cac0 61 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74 70  and get the outp
2cad0 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74  ut of.  ** print
2cae0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
2caf0 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  () immediately..
2cb00 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74    */.  fflush(st
2cb10 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  dout);.  Tcl_Set
2cb20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2cb30 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
2cb40 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
2cb50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
2cb60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2cb70 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
2cb80 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74  ./*.** sqlite3_t
2cb90 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42  est_control VERB
2cba0 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74   ARGS....*/.stat
2cbb0 69 63 20 69 6e 74 20 74 65 73 74 5f 74 65 73 74  ic int test_test
2cbc0 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64  _control(.  void
2cbd0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2cbe0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2cbf0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2cc00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2cc10 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74  T objv[].){.  st
2cc20 72 75 63 74 20 56 65 72 62 20 7b 0a 20 20 20 20  ruct Verb {.    
2cc30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2cc40 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e;.    int i;.  
2cc50 7d 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20  } aVerb[] = {.  
2cc60 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54    { "SQLITE_TEST
2cc70 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
2cc80 41 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54 45  AULT", SQLITE_TE
2cc90 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
2cca0 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20 7b  _FAULT }, .    {
2ccb0 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
2ccc0 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c 20  L_SORTER_MMAP", 
2ccd0 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
2cce0 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20  TRL_SORTER_MMAP 
2ccf0 20 20 20 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53      }, .    { "S
2cd00 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
2cd10 4d 50 4f 53 54 45 52 22 2c 20 20 20 20 20 20 20  MPOSTER",       
2cd20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2cd30 5f 49 4d 50 4f 53 54 45 52 20 20 20 20 20 20 20  _IMPOSTER       
2cd40 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
2cd50 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c 61  Verb;.  int iFla
2cd60 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
2cd70 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
2cd80 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2cd90 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2cda0 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e 2e  jv, "VERB ARGS..
2cdb0 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
2cdc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2cdd0 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e    rc = Tcl_GetIn
2cde0 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74  dexFromObjStruct
2cdf0 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20  (.      interp, 
2ce00 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c 20  objv[1], aVerb, 
2ce10 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d 29  sizeof(aVerb[0])
2ce20 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69 56  , "VERB", 0, &iV
2ce30 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  erb.  );.  if( r
2ce40 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
2ce50 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67 20  rn rc;..  iFlag 
2ce60 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e 69  = aVerb[iVerb].i
2ce70 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c 61  ;.  switch( iFla
2ce80 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  g ){.    case SQ
2ce90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
2cea0 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b  CALTIME_FAULT: {
2ceb0 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a  .      int val;.
2cec0 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
2ced0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
2cee0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2cef0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
2cf00 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20  ONOFF");.       
2cf10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2cf20 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
2cf30 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
2cf40 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
2cf50 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
2cf60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2cf70 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
2cf80 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2cf90 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2cfa0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
2cfb0 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  , val);.      br
2cfc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
2cfd0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
2cfe0 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
2cff0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61  : {.      int va
2d000 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
2d010 20 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20   *db;.      if( 
2d020 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
2d030 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2d040 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
2d050 62 6a 76 2c 20 22 44 42 20 4c 49 4d 49 54 22 29  bjv, "DB LIMIT")
2d060 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d070 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2d080 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 65    }.      if( ge
2d090 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2d0a0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2d0b0 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20  (objv[2]), &db) 
2d0c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2d0d0 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63  OR;.      if( Tc
2d0e0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2d0f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
2d100 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
2d110 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2d120 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2d130 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2d140 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
2d150 50 2c 20 64 62 2c 20 76 61 6c 29 3b 0a 20 20 20  P, db, val);.   
2d160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2d170 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d180 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
2d190 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ER: {.      int 
2d1a0 6f 6e 4f 66 66 2c 20 74 6e 75 6d 3b 0a 20 20 20  onOff, tnum;.   
2d1b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2d1c0 44 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  DbName;.      sq
2d1d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20  lite3 *db;.     
2d1e0 20 69 66 28 20 6f 62 6a 63 21 3d 36 20 29 7b 0a   if( objc!=6 ){.
2d1f0 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
2d200 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2d210 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62   2, objv, "DB db
2d220 4e 61 6d 65 20 6f 6e 4f 66 66 20 74 6e 75 6d 22  Name onOff tnum"
2d230 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2d240 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2d250 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67     }.      if( g
2d260 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2d270 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2d280 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29  g(objv[2]), &db)
2d290 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2d2a0 52 4f 52 3b 0a 20 20 20 20 20 20 7a 44 62 4e 61  ROR;.      zDbNa
2d2b0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
2d2c0 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
2d2d0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
2d2e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
2d2f0 20 6f 62 6a 76 5b 34 5d 2c 20 26 6f 6e 4f 66 66   objv[4], &onOff
2d300 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2d310 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
2d320 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2d330 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35  j(interp, objv[5
2d340 5d 2c 20 26 74 6e 75 6d 29 20 29 20 72 65 74 75  ], &tnum) ) retu
2d350 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d360 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
2d370 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2d380 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2d390 52 2c 20 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  R, db, zDbName, 
2d3a0 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20  onOff, tnum);.  
2d3b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d3c0 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65  .  }..  Tcl_Rese
2d3d0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
2d3e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2d3f0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2d400 4f 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75 64 65  OS_UNIX.#include
2d410 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69   <sys/time.h>.#i
2d420 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f  nclude <sys/reso
2d430 75 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69 63 20  urce.h>..static 
2d440 69 6e 74 20 74 65 73 74 5f 67 65 74 72 75 73 61  int test_getrusa
2d450 67 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ge(.  void * cli
2d460 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2d470 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2d480 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2d490 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2d4a0 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 62 75 66  [].){.  char buf
2d4b0 5b 31 30 32 34 5d 3b 0a 20 20 73 74 72 75 63 74  [1024];.  struct
2d4c0 20 72 75 73 61 67 65 20 72 3b 0a 20 20 6d 65 6d   rusage r;.  mem
2d4d0 73 65 74 28 26 72 2c 20 30 2c 20 73 69 7a 65 6f  set(&r, 0, sizeo
2d4e0 66 28 72 29 29 3b 0a 20 20 67 65 74 72 75 73 61  f(r));.  getrusa
2d4f0 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20  ge(RUSAGE_SELF, 
2d500 26 72 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  &r);..  sqlite3_
2d510 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2d520 62 75 66 29 2c 20 62 75 66 2c 0a 20 20 20 20 22  buf), buf,.    "
2d530 72 75 5f 75 74 69 6d 65 3d 25 64 2e 25 30 36 64  ru_utime=%d.%06d
2d540 20 72 75 5f 73 74 69 6d 65 3d 25 64 2e 25 30 36   ru_stime=%d.%06
2d550 64 20 72 75 5f 6d 69 6e 66 6c 74 3d 25 64 20 72  d ru_minflt=%d r
2d560 75 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c 20 0a 20  u_majflt=%d", . 
2d570 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69     (int)r.ru_uti
2d580 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29  me.tv_sec, (int)
2d590 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73  r.ru_utime.tv_us
2d5a0 65 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e  ec, .    (int)r.
2d5b0 72 75 5f 73 74 69 6d 65 2e 74 76 5f 73 65 63 2c  ru_stime.tv_sec,
2d5c0 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65   (int)r.ru_stime
2d5d0 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28  .tv_usec, .    (
2d5e0 69 6e 74 29 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c  int)r.ru_minflt,
2d5f0 20 28 69 6e 74 29 72 2e 72 75 5f 6d 61 6a 66 6c   (int)r.ru_majfl
2d600 74 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 53 65 74  t.  );.  Tcl_Set
2d610 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2d620 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2d630 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 20 20  bj(buf, -1));.  
2d640 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2d650 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
2d660 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a  ITE_OS_WIN./*.**
2d670 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73   Information pas
2d680 73 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  sed from the mai
2d690 6e 20 74 68 72 65 61 64 20 69 6e 74 6f 20 74 68  n thread into th
2d6a0 65 20 77 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c  e windows file l
2d6b0 6f 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f  ocker.** backgro
2d6c0 75 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73  und thread..*/.s
2d6d0 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c  truct win32FileL
2d6e0 6f 63 6b 65 72 20 7b 0a 20 20 63 68 61 72 20 2a  ocker {.  char *
2d6f0 65 76 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a  evName;       /*
2d700 20 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74 20 74   Name of event t
2d710 6f 20 73 69 67 6e 61 6c 20 74 68 72 65 61 64 20  o signal thread 
2d720 73 74 61 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e  startup */.  HAN
2d730 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 20  DLE h;          
2d740 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20 74 68   /* Handle of th
2d750 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
2d760 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ked */.  int del
2d770 61 79 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ay1;         /* 
2d780 44 65 6c 61 79 20 62 65 66 6f 72 65 20 6c 6f 63  Delay before loc
2d790 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  king */.  int de
2d7a0 6c 61 79 32 3b 20 20 20 20 20 20 20 20 20 2f 2a  lay2;         /*
2d7b0 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20 75 6e   Delay before un
2d7c0 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  locking */.  int
2d7d0 20 6f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   ok;            
2d7e0 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f 6b 20   /* Finished ok 
2d7f0 2a 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20 20 20  */.  int err;   
2d800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2d810 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2d820 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66  urs */.};.#endif
2d830 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ...#if SQLITE_OS
2d840 5f 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 70  _WIN.#include <p
2d850 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20  rocess.h>./*.** 
2d860 54 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  The background t
2d870 68 72 65 61 64 20 74 68 61 74 20 64 6f 65 73 20  hread that does 
2d880 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  file locking..*/
2d890 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2d8a0 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28 76  32_file_locker(v
2d8b0 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
2d8c0 20 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69    struct win32Fi
2d8d0 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28 73  leLocker *p = (s
2d8e0 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c  truct win32FileL
2d8f0 6f 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61 3b  ocker*)pAppData;
2d900 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d 65  .  if( p->evName
2d910 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 65   ){.    HANDLE e
2d920 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45 56  v = OpenEvent(EV
2d930 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54 45  ENT_MODIFY_STATE
2d940 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e 61  , FALSE, p->evNa
2d950 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65 76  me);.    if ( ev
2d960 20 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76 65   ){.      SetEve
2d970 6e 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43 6c  nt(ev);.      Cl
2d980 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20  oseHandle(ev);. 
2d990 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2d9a0 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65 70  ->delay1 ) Sleep
2d9b0 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20 69  (p->delay1);.  i
2d9c0 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68  f( LockFile(p->h
2d9d0 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30  , 0, 0, 10000000
2d9e0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c 65  0, 0) ){.    Sle
2d9f0 65 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a 20  ep(p->delay2);. 
2da00 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d     UnlockFile(p-
2da10 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30  >h, 0, 0, 100000
2da20 30 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  000, 0);.    p->
2da30 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ok = 1;.  }else{
2da40 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31 3b  .    p->err = 1;
2da50 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64  .  }.  CloseHand
2da60 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68  le(p->h);.  p->h
2da70 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79   = 0;.  p->delay
2da80 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61  1 = 0;.  p->dela
2da90 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  y2 = 0;.}.#endif
2daa0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2dab0 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c  WIN./*.**      l
2dac0 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46  ock_win32_file F
2dad0 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44  ILENAME DELAY1 D
2dae0 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20  ELAY2.**.** Get 
2daf0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61 6e  an exclusive man
2db00 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20 66  ditory lock on f
2db10 69 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20 6d  ile for DELAY2 m
2db20 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20  illiseconds..** 
2db30 57 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c 6c  Wait DELAY1 mill
2db40 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20  iseconds before 
2db50 61 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c 6f  acquiring the lo
2db60 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
2db70 74 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63  t win32_file_loc
2db80 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  k(.  void * clie
2db90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2dba0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2dbb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2dbc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2dbd0 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  ].){.  static st
2dbe0 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
2dbf0 63 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e 33  cker x = { "win3
2dc00 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c  2_file_lock", 0,
2dc10 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
2dc20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2dc30 6c 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a  lename;.  char z
2dc40 42 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20  Buf[200];.  int 
2dc50 72 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e  retry = 0;.  HAN
2dc60 44 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44 20  DLE ev;.  DWORD 
2dc70 77 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66  wResult;.  .  if
2dc80 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
2dc90 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
2dca0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2dcb0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46  erp, 1, objv, "F
2dcc0 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44  ILENAME DELAY1 D
2dcd0 45 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65 74  ELAY2");.    ret
2dce0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2dcf0 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31   }.  if( objc==1
2dd00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2dd10 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2dd20 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64  zBuf), zBuf, "%d
2dd30 20 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a 20   %d %d %d %d",. 
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd50 20 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c      x.ok, x.err,
2dd60 20 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c   x.delay1, x.del
2dd70 61 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54  ay2, x.h);.    T
2dd80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2dd90 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
2dda0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2ddb0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a  urn TCL_OK;.  }.
2ddc0 20 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26 20    while( x.h && 
2ddd0 72 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20 20  retry<30 ){.    
2dde0 72 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65  retry++;.    Sle
2ddf0 65 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69  ep(100);.  }.  i
2de00 66 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54 63  f( x.h ){.    Tc
2de10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2de20 6e 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20 28  nterp, "busy", (
2de30 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
2de40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2de50 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
2de60 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2de70 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e  rp, objv[2], &x.
2de80 64 65 6c 61 79 31 29 20 29 20 72 65 74 75 72 6e  delay1) ) return
2de90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
2dea0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2deb0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2dec0 5b 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29 20  [3], &x.delay2) 
2ded0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2dee0 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20  OR;.  zFilename 
2def0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2df00 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20  objv[1]);.  x.h 
2df10 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69  = CreateFile(zFi
2df20 6c 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f  lename, GENERIC_
2df30 52 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52 49  READ|GENERIC_WRI
2df40 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
2df50 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41    FILE_SHARE_REA
2df60 44 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  D|FILE_SHARE_WRI
2df70 54 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41  TE, 0, OPEN_ALWA
2df80 59 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  YS,.            
2df90 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45    FILE_ATTRIBUTE
2dfa0 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69  _NORMAL, 0);.  i
2dfb0 66 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20 54  f( !x.h ){.    T
2dfc0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2dfd0 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20  interp, "cannot 
2dfe0 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46  open file: ", zF
2dff0 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29  ilename, (char*)
2e000 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2e010 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2e020 65 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74  ev = CreateEvent
2e030 28 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c  (NULL, TRUE, FAL
2e040 53 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20  SE, x.evName);. 
2e050 20 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20 20   if ( !ev ){.   
2e060 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2e070 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
2e080 74 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a 20  t create event: 
2e090 22 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68  ", x.evName, (ch
2e0a0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2e0b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2e0c0 7d 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64  }.  _beginthread
2e0d0 28 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b  (win32_file_lock
2e0e0 65 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 78  er, 0, (void*)&x
2e0f0 29 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a 20  );.  Sleep(0);. 
2e100 20 69 66 20 28 20 28 77 52 65 73 75 6c 74 20 3d   if ( (wResult =
2e110 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62   WaitForSingleOb
2e120 6a 65 63 74 28 65 76 2c 20 31 30 30 30 30 29 29  ject(ev, 10000))
2e130 21 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20  !=WAIT_OBJECT_0 
2e140 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2e150 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2e160 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78 25  Buf), zBuf, "0x%
2e170 78 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20 20  x", wResult);.  
2e180 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2e190 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69 74  lt(interp, "wait
2e1a0 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66   failed: ", zBuf
2e1b0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2e1c0 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29   CloseHandle(ev)
2e1d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2e1e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c  _ERROR;.  }.  Cl
2e1f0 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20  oseHandle(ev);. 
2e200 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2e210 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78  }../*.**      ex
2e220 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 20  ists_win32_path 
2e230 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  PATH.**.** Retur
2e240 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
2e250 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
2e260 68 20 65 78 69 73 74 73 2c 20 77 68 6f 73 65 20  h exists, whose 
2e270 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
2e280 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65  name.** may exce
2e290 65 64 20 32 36 30 20 63 68 61 72 61 63 74 65 72  ed 260 character
2e2a0 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
2e2b0 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e  xed with "\\?\".
2e2c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2e2d0 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68  in32_exists_path
2e2e0 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
2e2f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2e300 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2e310 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2e320 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2e330 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ){.  if( objc!=2
2e340 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2e350 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2e360 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48 22   1, objv, "PATH"
2e370 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2e380 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
2e390 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2e3a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
2e3b0 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20  ooleanObj(.     
2e3c0 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
2e3d0 65 73 57 28 20 54 63 6c 5f 47 65 74 55 6e 69 63  esW( Tcl_GetUnic
2e3e0 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49  ode(objv[1]))!=I
2e3f0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
2e400 49 42 55 54 45 53 20 29 29 3b 0a 20 20 72 65 74  IBUTES ));.  ret
2e410 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2e420 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64 5f 77  *.**      find_w
2e430 69 6e 33 32 5f 66 69 6c 65 20 50 41 54 54 45 52  in32_file PATTER
2e440 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  N.**.** Returns 
2e450 61 20 6c 69 73 74 20 6f 66 20 65 6e 74 72 69 65  a list of entrie
2e460 73 20 69 6e 20 61 20 64 69 72 65 63 74 6f 72 79  s in a directory
2e470 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
2e480 73 70 65 63 69 66 69 65 64 20 70 61 74 74 65 72  specified patter
2e490 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c  n,.** whose full
2e4a0 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
2e4b0 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 20   may exceed 248 
2e4c0 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74  characters if it
2e4d0 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74   is prefixed wit
2e4e0 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  h.** "\\?\"..*/.
2e4f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
2e500 5f 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f  _find_file(.  vo
2e510 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2e520 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2e530 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2e540 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2e550 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48  ST objv[].){.  H
2e560 41 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65 20  ANDLE hFindFile 
2e570 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
2e580 5f 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f  _VALUE;.  WIN32_
2e590 46 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64 44  FIND_DATAW findD
2e5a0 61 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ata;.  Tcl_Obj *
2e5b0 6c 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44  listObj;.  DWORD
2e5c0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66   lastErrno;.  if
2e5d0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
2e5e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2e5f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2e600 76 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a 20  v, "PATTERN");. 
2e610 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e620 52 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64  ROR;.  }.  hFind
2e630 46 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73 74  File = FindFirst
2e640 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69  FileW(Tcl_GetUni
2e650 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  code(objv[1]), &
2e660 66 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66 28  findData);.  if(
2e670 20 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41   hFindFile==INVA
2e680 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
2e690 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
2e6a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2e6b0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
2e6c0 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
2e6d0 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
2e6e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2e6f0 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e   listObj = Tcl_N
2e700 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49  ewObj();.  Tcl_I
2e710 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74  ncrRefCount(list
2e720 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  Obj);.  do {.   
2e730 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2e740 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2e750 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e  , listObj, Tcl_N
2e760 65 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20  ewUnicodeObj(.  
2e770 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 63        findData.c
2e780 46 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a  FileName, -1));.
2e790 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2e7a0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2e7b0 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63  erp, listObj, Tc
2e7c0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
2e7d0 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74  .        findDat
2e7e0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
2e7f0 65 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28  es));.  } while(
2e800 20 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68   FindNextFileW(h
2e810 46 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64 44  FindFile, &findD
2e820 61 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45 72  ata) );.  lastEr
2e830 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
2e840 6f 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73 74  or();.  if( last
2e850 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20  Errno!=NO_ERROR 
2e860 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  && lastErrno!=ER
2e870 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45  ROR_NO_MORE_FILE
2e880 53 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f  S ){.    FindClo
2e890 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20  se(hFindFile);. 
2e8a0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2e8b0 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  unt(listObj);.  
2e8c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2e8d0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2e8e0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
2e8f0 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
2e900 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e910 52 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43  ROR;.  }.  FindC
2e920 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b  lose(hFindFile);
2e930 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
2e940 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ult(interp, list
2e950 4f 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Obj);.  return T
2e960 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2e970 20 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33       delete_win3
2e980 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a  2_file FILENAME.
2e990 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74 68  **.** Deletes th
2e9a0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2e9b0 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  , whose fully qu
2e9c0 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79  alified name may
2e9d0 20 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20 63   exceed 260.** c
2e9e0 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2e9f0 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2ea00 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
2ea10 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 64 65 6c  ic int win32_del
2ea20 65 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64  ete_file(.  void
2ea30 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
2ea40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ea50 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2ea60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2ea70 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
2ea80 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2ea90 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2eaa0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2eab0 2c 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  , "FILENAME");. 
2eac0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2ead0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ROR;.  }.  if( !
2eae0 44 65 6c 65 74 65 46 69 6c 65 57 28 54 63 6c 5f  DeleteFileW(Tcl_
2eaf0 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b  GetUnicode(objv[
2eb00 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  1])) ){.    Tcl_
2eb10 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2eb20 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
2eb30 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72  IntObj(GetLastEr
2eb40 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74  ror()));.    ret
2eb50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2eb60 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65   }.  Tcl_ResetRe
2eb70 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
2eb80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2eb90 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b  ../*.**      mak
2eba0 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45  e_win32_dir DIRE
2ebb0 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61  CTORY.**.** Crea
2ebc0 74 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65  tes the specifie
2ebd0 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f  d directory, who
2ebe0 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
2ebf0 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
2ec00 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63  ed 248.** charac
2ec10 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
2ec20 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
2ec30 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
2ec40 74 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28 0a 20  t win32_mkdir(. 
2ec50 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
2ec60 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2ec70 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2ec80 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2ec90 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2eca0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2ecb0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2ecc0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2ecd0 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52   objv, "DIRECTOR
2ece0 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Y");.    return 
2ecf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ed00 20 69 66 28 20 21 43 72 65 61 74 65 44 69 72 65   if( !CreateDire
2ed10 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e  ctoryW(Tcl_GetUn
2ed20 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20  icode(objv[1]), 
2ed30 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54 63 6c  NULL) ){.    Tcl
2ed40 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2ed50 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
2ed60 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
2ed70 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
2ed80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ed90 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52    }.  Tcl_ResetR
2eda0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2edb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2edc0 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 72 65  }../*.**      re
2edd0 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 20 44  move_win32_dir D
2ede0 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52  IRECTORY.**.** R
2edf0 65 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63 69  emoves the speci
2ee00 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20  fied directory, 
2ee10 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c  whose fully qual
2ee20 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65  ified name may e
2ee30 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61  xceed 248.** cha
2ee40 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
2ee50 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22   prefixed with "
2ee60 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  \\?\"..*/.static
2ee70 20 69 6e 74 20 77 69 6e 33 32 5f 72 6d 64 69 72   int win32_rmdir
2ee80 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
2ee90 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2eea0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2eeb0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2eec0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2eed0 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ){.  if( objc!=2
2eee0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2eef0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2ef00 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43   1, objv, "DIREC
2ef10 54 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75  TORY");.    retu
2ef20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2ef30 7d 0a 20 20 69 66 28 20 21 52 65 6d 6f 76 65 44  }.  if( !RemoveD
2ef40 69 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65  irectoryW(Tcl_Ge
2ef50 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d  tUnicode(objv[1]
2ef60 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  )) ){.    Tcl_Se
2ef70 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2ef80 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
2ef90 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
2efa0 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
2efb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2efc0 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
2efd0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
2efe0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
2eff0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20  endif.../*.**   
2f000 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f     optimization_
2f010 63 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20 42  control DB OPT B
2f020 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61  OOLEAN.**.** Ena
2f030 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 71  ble or disable q
2f040 75 65 72 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f  uery optimizatio
2f050 6e 73 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ns using the sql
2f060 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2f070 6c 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  l().** interface
2f080 2e 20 20 44 69 73 61 62 6c 65 20 69 66 20 42 4f  .  Disable if BO
2f090 4f 4c 45 41 4e 20 69 73 20 66 61 6c 73 65 20 61  OLEAN is false a
2f0a0 6e 64 20 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f  nd enable if BOO
2f0b0 4c 45 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  LEAN is true..**
2f0c0 20 4f 50 54 20 69 73 20 74 68 65 20 6e 61 6d 65   OPT is the name
2f0d0 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   of the optimiza
2f0e0 74 69 6f 6e 20 74 6f 20 62 65 20 64 69 73 61 62  tion to be disab
2f0f0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
2f100 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f  nt optimization_
2f110 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20  control(.  void 
2f120 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2f130 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2f140 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2f150 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2f160 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
2f170 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
2f180 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
2f190 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f  *zOpt;.  int ono
2f1a0 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d  ff;.  int mask =
2f1b0 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
2f1c0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
2f1d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74  const char *zOpt
2f1e0 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61  Name;.    int ma
2f1f0 73 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d  sk;.  } aOpt[] =
2f200 20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20   {.    { "all", 
2f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f220 53 51 4c 49 54 45 5f 41 6c 6c 4f 70 74 73 20 20  SQLITE_AllOpts  
2f230 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2f240 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20 20 20 20  none",          
2f250 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
2f260 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2f270 20 20 20 7b 20 22 71 75 65 72 79 2d 66 6c 61 74     { "query-flat
2f280 74 65 6e 65 72 22 2c 20 20 20 20 20 53 51 4c 49  tener",     SQLI
2f290 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
2f2a0 72 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75  r },.    { "colu
2f2b0 6d 6e 2d 63 61 63 68 65 22 2c 20 20 20 20 20 20  mn-cache",      
2f2c0 20 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43    SQLITE_ColumnC
2f2d0 61 63 68 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ache    },.    {
2f2e0 20 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72 22   "groupby-order"
2f2f0 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 47  ,       SQLITE_G
2f300 72 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d 2c  roupByOrder   },
2f310 0a 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d 63  .    { "factor-c
2f320 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20 20 53 51  onstants",    SQ
2f330 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
2f340 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69  nst },.    { "di
2f350 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20  stinct-opt",    
2f360 20 20 20 20 53 51 4c 49 54 45 5f 44 69 73 74 69      SQLITE_Disti
2f370 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20  nctOpt    },.   
2f380 20 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d 73 63   { "cover-idx-sc
2f390 61 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  an",      SQLITE
2f3a0 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 20 20 20  _CoverIdxScan   
2f3b0 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65 72 2d  },.    { "order-
2f3c0 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20  by-idx-join",   
2f3d0 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
2f3e0 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22  xJoin },.    { "
2f3f0 74 72 61 6e 73 69 74 69 76 65 22 2c 20 20 20 20  transitive",    
2f400 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 72 61        SQLITE_Tra
2f410 6e 73 69 74 69 76 65 20 20 20 20 20 7d 2c 0a 20  nsitive     },. 
2f420 20 20 20 7b 20 22 73 75 62 71 75 65 72 79 2d 63     { "subquery-c
2f430 6f 72 6f 75 74 69 6e 65 22 2c 20 20 53 51 4c 49  oroutine",  SQLI
2f440 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65  TE_SubqCoroutine
2f450 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d 69 74    },.    { "omit
2f460 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20 20  -noop-join",    
2f470 20 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f    SQLITE_OmitNoo
2f480 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20 20 20 7b  pJoin   },.    {
2f490 20 22 73 74 61 74 33 22 2c 20 20 20 20 20 20 20   "stat3",       
2f4a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
2f4b0 74 61 74 33 34 20 20 20 20 20 20 20 20 20 7d 2c  tat34         },
2f4c0 0a 20 20 20 20 7b 20 22 73 74 61 74 34 22 2c 20  .    { "stat4", 
2f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2f4e0 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20 20 20  LITE_Stat34     
2f4f0 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69      },.  };..  i
2f500 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
2f510 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2f520 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2f530 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c  jv, "DB OPT BOOL
2f540 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
2f550 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2f560 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2f570 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2f580 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2f590 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
2f5a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
2f5b0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
2f5c0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
2f5d0 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66   objv[3], &onoff
2f5e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2f5f0 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54  RROR;.  zOpt = T
2f600 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2f610 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
2f620 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29  ; i<sizeof(aOpt)
2f630 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
2f640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2f650 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70  strcmp(zOpt, aOp
2f660 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d  t[i].zOptName)==
2f670 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  0 ){.      mask 
2f680 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a  = aOpt[i].mask;.
2f690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f6a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f   }.  }.  if( ono
2f6b0 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73  ff ) mask = ~mas
2f6c0 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65  k;.  if( i>=size
2f6d0 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
2f6e0 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20  aOpt[0]) ){.    
2f6f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2f700 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
2f710 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
2f720 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
2f730 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  f:",.           
2f740 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2f750 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  )0);.    for(i=0
2f760 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29  ; i<sizeof(aOpt)
2f770 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
2f780 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
2f790 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2f7a0 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70 74  nterp, " ", aOpt
2f7b0 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28 63  [i].zOptName, (c
2f7c0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20  har*)0);.    }. 
2f7d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2f7e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
2f7f0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2f800 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2f810 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 64  OPTIMIZATIONS, d
2f820 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65 74 75  b, mask);.  retu
2f830 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79  rn TCL_OK;.}..ty
2f840 70 65 64 65 66 20 73 74 72 75 63 74 20 73 71 6c  pedef struct sql
2f850 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2f860 73 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  s sqlite3_api_ro
2f870 75 74 69 6e 65 73 3b 0a 2f 2a 0a 2a 2a 20 20 20  utines;./*.**   
2f880 20 20 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78    load_static_ex
2f890 74 65 6e 73 69 6f 6e 20 44 42 20 4e 41 4d 45 20  tension DB NAME 
2f8a0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61 64 20 6f  ....**.** Load o
2f8b0 6e 65 20 6f 72 20 6d 6f 72 65 20 73 74 61 74 69  ne or more stati
2f8c0 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 65 78 74  cally linked ext
2f8d0 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ensions..*/.stat
2f8e0 69 63 20 69 6e 74 20 74 63 6c 4c 6f 61 64 53 74  ic int tclLoadSt
2f8f0 61 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64  aticExtensionCmd
2f900 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2f910 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2f920 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2f930 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2f940 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2f950 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  .){.  extern int
2f960 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f   sqlite3_amatch_
2f970 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2f980 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2f990 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2f9a0 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
2f9b0 73 71 6c 69 74 65 33 5f 63 61 72 72 61 79 5f 69  sqlite3_carray_i
2f9c0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2f9d0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2f9e0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2f9f0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2fa00 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69  qlite3_closure_i
2fa10 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2fa20 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2fa30 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2fa40 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2fa50 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 28  qlite3_csv_init(
2fa60 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2fa70 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2fa80 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2fa90 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2faa0 65 33 5f 65 76 61 6c 5f 69 6e 69 74 28 73 71 6c  e3_eval_init(sql
2fab0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2fac0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2fad0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2fae0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2faf0 66 69 6c 65 69 6f 5f 69 6e 69 74 28 73 71 6c 69  fileio_init(sqli
2fb00 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2fb10 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2fb20 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2fb30 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
2fb40 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69 74  uzzer_init(sqlit
2fb50 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2fb60 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2fb70 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2fb80 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 65  n int sqlite3_ie
2fb90 65 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ee_init(sqlite3*
2fba0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2fbb0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2fbc0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2fbd0 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63  nt sqlite3_nextc
2fbe0 68 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  har_init(sqlite3
2fbf0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2fc00 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2fc10 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2fc20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72 63  int sqlite3_perc
2fc30 65 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69  entile_init(sqli
2fc40 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2fc50 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2fc60 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2fc70 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72  rn int sqlite3_r
2fc80 65 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69 74  egexp_init(sqlit
2fc90 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2fca0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2fcb0 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2fcc0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
2fcd0 72 69 65 73 5f 69 6e 69 74 28 73 71 6c 69 74 65  ries_init(sqlite
2fce0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2fcf0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2fd00 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2fd10 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65   int sqlite3_spe
2fd20 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74  llfix_init(sqlit
2fd30 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2fd40 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2fd50 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2fd60 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  n int sqlite3_to
2fd70 74 79 70 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  type_init(sqlite
2fd80 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2fd90 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2fda0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2fdb0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f   int sqlite3_who
2fdc0 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71  lenumber_init(sq
2fdd0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2fde0 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2fdf0 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74  routines*);.  st
2fe00 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2fe10 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
2fe20 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20  ar *zExtName;.  
2fe30 20 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28 73    int (*pInit)(s
2fe40 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2fe50 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2fe60 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d  _routines*);.  }
2fe70 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20   aExtension[] = 
2fe80 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68 22  {.    { "amatch"
2fe90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2fea0 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f   sqlite3_amatch_
2feb0 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
2fec0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 61 72     },.    { "car
2fed0 72 61 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ray",           
2fee0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 61 72       sqlite3_car
2fef0 72 61 79 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ray_init        
2ff00 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2ff10 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20 20  "closure",      
2ff20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ff30 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20 20  _closure_init   
2ff40 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2ff50 20 20 7b 20 22 63 73 76 22 2c 20 20 20 20 20 20    { "csv",      
2ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ff70 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 20 20 20  ite3_csv_init   
2ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2ff90 2c 0a 20 20 20 20 7b 20 22 65 76 61 6c 22 2c 20  ,.    { "eval", 
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffb0 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e   sqlite3_eval_in
2ffc0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
2ffd0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c     },.    { "fil
2ffe0 65 69 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  eio",           
2fff0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
30000 65 69 6f 5f 69 6e 69 74 20 20 20 20 20 20 20 20  eio_init        
30010 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30020 22 66 75 7a 7a 65 72 22 2c 20 20 20 20 20 20 20  "fuzzer",       
30030 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30040 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20 20 20  _fuzzer_init    
30050 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30060 20 20 7b 20 22 69 65 65 65 37 35 34 22 2c 20 20    { "ieee754",  
30070 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30080 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 20 20  ite3_ieee_init  
30090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
300a0 2c 0a 20 20 20 20 7b 20 22 6e 65 78 74 63 68 61  ,.    { "nextcha
300b0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
300c0 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61   sqlite3_nextcha
300d0 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  r_init          
300e0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 65 72     },.    { "per
300f0 63 65 6e 74 69 6c 65 22 2c 20 20 20 20 20 20 20  centile",       
30100 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 65 72       sqlite3_per
30110 63 65 6e 74 69 6c 65 5f 69 6e 69 74 20 20 20 20  centile_init    
30120 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30130 22 72 65 67 65 78 70 22 2c 20 20 20 20 20 20 20  "regexp",       
30140 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30150 5f 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20 20  _regexp_init    
30160 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30170 20 20 7b 20 22 73 65 72 69 65 73 22 2c 20 20 20    { "series",   
30180 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30190 69 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69 74  ite3_series_init
301a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
301b0 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66 69  ,.    { "spellfi
301c0 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
301d0 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69   sqlite3_spellfi
301e0 78 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  x_init          
301f0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74     },.    { "tot
30200 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
30210 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 74       sqlite3_tot
30220 79 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ype_init        
30230 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30240 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20 20  "wholenumber",  
30250 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30260 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69  _wholenumber_ini
30270 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  t          },.  
30280 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  };.  sqlite3 *db
30290 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
302a0 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c 20  zName;.  int i, 
302b0 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  j, rc;.  char *z
302c0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66  ErrMsg = 0;.  if
302d0 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20  ( objc<3 ){.    
302e0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
302f0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
30300 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22 29  , "DB NAME ...")
30310 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
30320 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
30330 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
30340 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
30350 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
30360 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
30370 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d  _ERROR;.  for(j=
30380 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b  2; j<objc; j++){
30390 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
303a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
303b0 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
303c0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 45  ; i<ArraySize(aE
303d0 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b  xtension); i++){
303e0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
303f0 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e 73  p(zName, aExtens
30400 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65 29  ion[i].zExtName)
30410 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
30420 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72   }.    if( i>=Ar
30430 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73 69  raySize(aExtensi
30440 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  on) ){.      Tcl
30450 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
30460 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 65  terp, "no such e
30470 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61  xtension: ", zNa
30480 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
30490 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
304a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
304b0 20 69 66 28 20 61 45 78 74 65 6e 73 69 6f 6e 5b   if( aExtension[
304c0 69 5d 2e 70 49 6e 69 74 20 29 7b 0a 20 20 20 20  i].pInit ){.    
304d0 20 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69 6f    rc = aExtensio
304e0 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26  n[i].pInit(db, &
304f0 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20  zErrMsg, 0);.   
30500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
30510 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30520 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
30530 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72  SQLITE_OK || zEr
30540 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63  rMsg ){.      Tc
30550 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
30560 6e 74 65 72 70 2c 20 22 69 6e 69 74 69 61 6c 69  nterp, "initiali
30570 7a 61 74 69 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61  zation of ", zNa
30580 6d 65 2c 20 22 20 66 61 69 6c 65 64 3a 20 22 2c  me, " failed: ",
30590 20 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20   zErrMsg,.      
305a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305b0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
305c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
305d0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
305e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
305f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
30600 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
30610 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f  *.**     sorter_
30620 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 42 4f  test_fakeheap BO
30630 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  OL.**.*/.static 
30640 69 6e 74 20 73 6f 72 74 65 72 5f 74 65 73 74 5f  int sorter_test_
30650 66 61 6b 65 68 65 61 70 28 0a 20 20 76 6f 69 64  fakeheap(.  void
30660 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
30670 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
30680 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
30690 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
306a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
306b0 74 20 62 41 72 67 3b 0a 20 20 69 66 28 20 6f 62  t bArg;.  if( ob
306c0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
306d0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
306e0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
306f0 42 4f 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74 75  BOOL");.    retu
30700 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30710 7d 0a 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  }..  if( Tcl_Get
30720 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
30730 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
30740 26 62 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65  &bArg) ){.    re
30750 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30760 20 20 7d 0a 0a 20 20 69 66 28 20 62 41 72 67 20    }..  if( bArg 
30770 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
30780 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
30790 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Heap==0 ){.     
307a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
307b0 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 53 51 4c  nfig.pHeap = SQL
307c0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d  ITE_INT_TO_PTR(-
307d0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
307e0 65 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e{.    if( sqlit
307f0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
30800 48 65 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Heap==SQLITE_INT
30810 5f 54 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a 20  _TO_PTR(-1) ){. 
30820 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
30830 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
30840 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
30850 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
30860 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
30870 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
30880 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74  .**     sorter_t
30890 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72  est_sort4_helper
308a0 20 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53   DB SQL1 NSTEP S
308b0 51 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  QL2.**.** Compil
308c0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
308d0 24 53 51 4c 31 20 61 6e 64 20 73 74 65 70 20 69  $SQL1 and step i
308e0 74 20 24 4e 53 54 45 50 20 74 69 6d 65 73 2e 20  t $NSTEP times. 
308f0 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 0a 2a  For each row, .*
30900 2a 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  * check that the
30910 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 72 69   leftmost and ri
30920 67 68 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ghtmost columns 
30930 72 65 74 75 72 6e 65 64 20 61 72 65 20 62 6f 74  returned are bot
30940 68 20 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20 61  h integers,.** a
30950 6e 64 20 74 68 61 74 20 62 6f 74 68 20 63 6f 6e  nd that both con
30960 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 76 61  tain the same va
30970 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  lue..**.** Then 
30980 65 78 65 63 75 74 65 20 73 74 61 74 65 6d 65 6e  execute statemen
30990 74 20 24 53 51 4c 32 2e 20 43 68 65 63 6b 20 74  t $SQL2. Check t
309a0 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
309b0 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61  t returns the sa
309c0 6d 65 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e 74  me.** set of int
309d0 65 67 65 72 73 20 69 6e 20 74 68 65 20 73 61 6d  egers in the sam
309e0 65 20 6f 72 64 65 72 20 61 73 20 69 6e 20 74 68  e order as in th
309f0 65 20 70 72 65 76 69 6f 75 73 20 73 74 65 70 20  e previous step 
30a00 28 75 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a 2a  (using $SQL1)..*
30a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  /.static int sor
30a20 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68  ter_test_sort4_h
30a30 65 6c 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  elper(.  void * 
30a40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
30a50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
30a60 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
30a70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
30a80 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
30a90 20 63 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20   char *zSql1;.  
30aa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
30ab0 32 3b 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20  2;.  int nStep; 
30ac0 0a 20 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20  .  int iStep; . 
30ad0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43   unsigned int iC
30ae0 6b 73 75 6d 31 20 3d 20 30 3b 20 0a 20 20 75 6e  ksum1 = 0; .  un
30af0 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6b 73 75  signed int iCksu
30b00 6d 32 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 72  m2 = 0; .  int r
30b10 63 3b 0a 20 20 69 6e 74 20 69 42 3b 0a 20 20 73  c;.  int iB;.  s
30b20 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
30b30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
30b40 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  t;.  .  if( objc
30b50 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
30b60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
30b70 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
30b80 20 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32   SQL1 NSTEP SQL2
30b90 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
30ba0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
30bb0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
30bc0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
30bd0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
30be0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
30bf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
30c00 6c 31 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  l1 = Tcl_GetStri
30c10 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
30c20 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
30c30 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
30c40 76 5b 33 5d 2c 20 26 6e 53 74 65 70 29 20 29 20  v[3], &nStep) ) 
30c50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30c60 3b 0a 20 20 7a 53 71 6c 32 20 3d 20 54 63 6c 5f  ;.  zSql2 = Tcl_
30c70 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34  GetString(objv[4
30c80 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ]);..  rc = sqli
30c90 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
30ca0 62 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c 20 26 70  b, zSql1, -1, &p
30cb0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
30cc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
30cd0 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a  goto sql_error;.
30ce0 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 5f  .  iB = sqlite3_
30cf0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
30d00 6d 74 29 2d 31 3b 0a 20 20 66 6f 72 28 69 53 74  mt)-1;.  for(iSt
30d10 65 70 3d 30 3b 20 69 53 74 65 70 3c 6e 53 74 65  ep=0; iStep<nSte
30d20 70 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  p && SQLITE_ROW=
30d30 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
30d40 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a  tmt); iStep++){.
30d50 20 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69      int a = sqli
30d60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
30d70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
30d80 28 20 61 21 3d 73 71 6c 69 74 65 33 5f 63 6f 6c  ( a!=sqlite3_col
30d90 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69  umn_int(pStmt, i
30da0 42 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  B) ){.      Tcl_
30db0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
30dc0 65 72 70 2c 20 22 64 61 74 61 20 65 72 72 6f 72  erp, "data error
30dd0 3a 20 28 61 21 3d 62 29 22 2c 20 30 29 3b 0a 20  : (a!=b)", 0);. 
30de0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
30df0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
30e00 20 20 69 43 6b 73 75 6d 31 20 2b 3d 20 28 69 43    iCksum1 += (iC
30e10 6b 73 75 6d 31 20 3c 3c 20 33 29 20 2b 20 28 75  ksum1 << 3) + (u
30e20 6e 73 69 67 6e 65 64 20 69 6e 74 29 61 3b 0a 20  nsigned int)a;. 
30e30 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
30e40 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
30e50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
30e60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71  ITE_OK ) goto sq
30e70 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d  l_error;..  rc =
30e80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
30e90 5f 76 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d  _v2(db, zSql2, -
30ea0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
30eb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30ec0 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72  OK ) goto sql_er
30ed0 72 6f 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70  ror;.  for(iStep
30ee0 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  =0; SQLITE_ROW==
30ef0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
30f00 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20  mt); iStep++){. 
30f10 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74     int a = sqlit
30f20 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
30f30 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b  tmt, 0);.    iCk
30f40 73 75 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32  sum2 += (iCksum2
30f50 20 3c 3c 20 33 29 20 2b 20 28 75 6e 73 69 67 6e   << 3) + (unsign
30f60 65 64 20 69 6e 74 29 61 3b 0a 20 20 7d 0a 20 20  ed int)a;.  }.  
30f70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
30f80 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
30f90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30fa0 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72  K ) goto sql_err
30fb0 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73 75  or;..  if( iCksu
30fc0 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20  m1!=iCksum2 ){. 
30fd0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
30fe0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 68 65  ult(interp, "che
30ff0 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c  cksum mismatch",
31000 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
31010 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
31020 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
31030 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54  . sql_error:.  T
31040 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
31050 69 6e 74 65 72 70 2c 20 22 73 71 6c 20 65 72 72  interp, "sql err
31060 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
31070 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
31080 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31090 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  R;.}...#ifdef SQ
310a0 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
310b0 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64  TICATION.#includ
310c0 65 20 22 73 71 6c 69 74 65 33 75 73 65 72 61 75  e "sqlite3userau
310d0 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  th.h"./*.** tclc
310e0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
310f0 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20 44  r_authenticate D
31100 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
31110 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ORD.*/.static in
31120 74 20 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68  t test_user_auth
31130 65 6e 74 69 63 61 74 65 28 0a 20 20 43 6c 69 65  enticate(.  Clie
31140 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
31150 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
31160 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
31170 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
31180 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
31190 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
311a0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
311b0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
311c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
311d0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
311e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
311f0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
31200 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
31210 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65  .){.  char *zUse
31220 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
31230 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
31240 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20  t nPasswd = 0;. 
31250 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
31260 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
31270 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
31280 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
31290 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
312a0 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53  "DB USERNAME PAS
312b0 53 57 4f 52 44 22 29 3b 0a 20 20 20 20 72 65 74  SWORD");.    ret
312c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
312d0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
312e0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
312f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
31300 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
31310 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
31320 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
31330 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
31340 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73  objv[2]);.  zPas
31350 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  swd = Tcl_GetStr
31360 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
31370 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20  3], &nPasswd);. 
31380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
31390 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28  er_authenticate(
313a0 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73  db, zUser, zPass
313b0 77 64 2c 20 6e 50 61 73 73 77 64 29 3b 0a 20 20  wd, nPasswd);.  
313c0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
313d0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
313e0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
313f0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
31400 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
31410 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
31420 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
31430 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ION */..#ifdef S
31440 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
31450 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
31460 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
31470 5f 75 73 65 72 5f 61 64 64 20 44 42 20 55 53 45  _user_add DB USE
31480 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
31490 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63  SADMIN.*/.static
314a0 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61   int test_user_a
314b0 64 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  dd(.  ClientData
314c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
314d0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
314e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
314f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
31500 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
31510 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
31520 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
31530 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
31540 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
31550 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
31560 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
31570 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
31580 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
31590 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
315a0 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64  .  char *zPasswd
315b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73   = 0;.  int nPas
315c0 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  swd = 0;.  int i
315d0 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71  sAdmin = 0;.  sq
315e0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
315f0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
31600 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
31610 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
31620 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
31630 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
31640 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20  RD ISADMIN");.  
31650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
31660 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
31670 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
31680 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
31690 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
316a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
316b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
316c0 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  User = Tcl_GetSt
316d0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
316e0 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47   zPasswd = Tcl_G
316f0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
31700 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77  objv[3], &nPassw
31710 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f  d);.  Tcl_GetBoo
31720 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
31730 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73  rp, objv[4], &is
31740 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73  Admin);.  rc = s
31750 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28  qlite3_user_add(
31760 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73  db, zUser, zPass
31770 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41  wd, nPasswd, isA
31780 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74  dmin);.  Tcl_Set
31790 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
317a0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
317b0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
317c0 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
317d0 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
317e0 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  * SQLITE_USER_AU
317f0 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a  THENTICATION */.
31800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
31810 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
31820 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  ON./*.** tclcmd:
31830 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63    sqlite3_user_c
31840 68 61 6e 67 65 20 44 42 20 55 53 45 52 4e 41 4d  hange DB USERNAM
31850 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  E PASSWORD ISADM
31860 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  IN.*/.static int
31870 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67   test_user_chang
31880 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
31890 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
318a0 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
318b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
318c0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
318d0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
318e0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
318f0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
31900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
31910 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
31920 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
31930 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
31940 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
31950 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
31960 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a  har *zUser = 0;.
31970 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20    char *zPasswd 
31980 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73  = 0;.  int nPass
31990 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  wd = 0;.  int is
319a0 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  Admin = 0;.  sql
319b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
319c0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
319d0 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
319e0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
319f0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
31a00 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
31a10 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20  D ISADMIN");.   
31a20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31a30 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
31a40 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
31a50 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
31a60 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
31a70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
31a80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55  _ERROR;.  }.  zU
31a90 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ser = Tcl_GetStr
31aa0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
31ab0 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65  zPasswd = Tcl_Ge
31ac0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
31ad0 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64  bjv[3], &nPasswd
31ae0 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  );.  Tcl_GetBool
31af0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
31b00 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41  p, objv[4], &isA
31b10 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71  dmin);.  rc = sq
31b20 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
31b30 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61  e(db, zUser, zPa
31b40 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69  sswd, nPasswd, i
31b50 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53  sAdmin);.  Tcl_S
31b60 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
31b70 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
31b80 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
31b90 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
31ba0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
31bb0 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
31bc0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
31bd0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
31be0 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
31bf0 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  TION./*.** tclcm
31c00 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
31c10 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45 52 4e  _delete DB USERN
31c20 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AME.*/.static in
31c30 74 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65  t test_user_dele
31c40 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
31c50 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
31c60 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
31c70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
31c80 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
31c90 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
31ca0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
31cb0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
31cc0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
31cd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
31ce0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
31cf0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
31d00 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
31d10 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
31d20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
31d30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
31d40 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
31d50 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
31d60 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
31d70 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
31d80 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29  , "DB USERNAME")
31d90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
31da0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
31db0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
31dc0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
31dd0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
31de0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
31df0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
31e00 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
31e10 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
31e20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
31e30 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62  3_user_delete(db
31e40 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f  , zUser);.  Tcl_
31e50 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
31e60 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
31e70 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
31e80 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
31e90 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
31ea0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
31eb0 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
31ec0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  */../*.** tclcmd
31ed0 3a 20 62 61 64 5f 62 65 68 61 76 69 6f 72 20 54  : bad_behavior T
31ee0 59 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d  YPE.**.** Do som
31ef0 65 20 74 68 69 6e 67 73 20 74 68 61 74 20 73 68  e things that sh
31f00 6f 75 6c 64 20 74 72 69 67 67 65 72 20 61 20 76  ould trigger a v
31f10 61 6c 67 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e  algrind or -fsan
31f20 69 74 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a  itize=undefined.
31f30 2a 2a 20 77 61 72 6e 69 6e 67 2e 20 20 54 68 69  ** warning.  Thi
31f40 73 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72  s is used to ver
31f50 69 66 79 20 74 68 61 74 20 65 72 72 6f 72 73 20  ify that errors 
31f60 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 6f 75 74  and warnings out
31f70 70 75 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20  put by those.** 
31f80 74 6f 6f 6c 73 20 61 72 65 20 64 65 74 65 63 74  tools are detect
31f90 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
31fa0 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  cripts..**.**   
31fb0 20 20 20 20 54 59 50 45 20 20 20 20 20 20 20 42      TYPE       B
31fc0 45 48 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20  EHAVIOR.**      
31fd0 20 31 20 20 20 20 20 20 20 20 20 20 4f 76 65 72   1          Over
31fe0 66 6c 6f 77 20 61 20 73 69 67 6e 65 64 20 69 6e  flow a signed in
31ff0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 32  teger.**       2
32000 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 62            Jump b
32010 61 73 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  ased on an unini
32020 74 69 61 6c 69 7a 65 64 20 76 61 72 69 61 62 6c  tialized variabl
32030 65 0a 2a 2a 20 20 20 20 20 20 20 33 20 20 20 20  e.**       3    
32040 20 20 20 20 20 20 52 65 61 64 20 61 66 74 65 72        Read after
32050 20 66 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 34   free.**       4
32060 20 20 20 20 20 20 20 20 20 20 50 61 6e 69 63 0a            Panic.
32070 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
32080 73 74 5f 62 61 64 5f 62 65 68 61 76 69 6f 72 28  st_bad_behavior(
32090 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
320a0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
320b0 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
320c0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65  er containing ze
320d0 72 6f 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ro */.  Tcl_Inte
320e0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
320f0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
32100 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
32110 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
32120 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
32130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32140 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
32150 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
32160 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
32170 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
32180 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
32190 69 54 79 70 65 3b 0a 20 20 69 6e 74 20 78 79 7a  iType;.  int xyz
321a0 3b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 28 69 6e  ;.  int i = *(in
321b0 74 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t*)clientData;. 
321c0 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 77 5b   int j;.  int w[
321d0 31 30 5d 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a 20  10];.  int *a;. 
321e0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
321f0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
32200 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
32210 6f 62 6a 76 2c 20 22 54 59 50 45 22 29 3b 0a 20  objv, "TYPE");. 
32220 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
32230 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
32240 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
32250 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
32260 2c 20 26 69 54 79 70 65 29 20 29 20 72 65 74 75  , &iType) ) retu
32270 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
32280 73 77 69 74 63 68 28 20 69 54 79 70 65 20 29 7b  switch( iType ){
32290 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
322a0 20 20 20 20 20 78 79 7a 20 3d 20 30 78 37 66 66       xyz = 0x7ff
322b0 66 66 66 30 30 20 2d 20 69 3b 0a 20 20 20 20 20  fff00 - i;.     
322c0 20 78 79 7a 20 2b 3d 20 30 78 31 30 30 3b 0a 20   xyz += 0x100;. 
322d0 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
322e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
322f0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 79 7a 29  l_NewIntObj(xyz)
32300 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
32310 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
32320 3a 20 7b 0a 20 20 20 20 20 20 77 5b 31 5d 20 3d  : {.      w[1] =
32330 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 77 5b   5;.      if( w[
32340 69 5d 3e 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20  i]>0 ) w[1]++;. 
32350 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
32360 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
32370 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 77 5b 31 5d  l_NewIntObj(w[1]
32380 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
32390 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
323a0 33 3a 20 7b 0a 20 20 20 20 20 20 61 20 3d 20 6d  3: {.      a = m
323b0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e  alloc( sizeof(in
323c0 74 29 2a 31 30 20 29 3b 0a 20 20 20 20 20 20 66  t)*10 );.      f
323d0 6f 72 28 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b  or(j=0; j<10; j+
323e0 2b 29 20 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20  +) a[j] = j;.   
323f0 20 20 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20     free(a);.    
32400 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
32410 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
32420 65 77 49 6e 74 4f 62 6a 28 61 5b 69 5d 29 29 3b  ewIntObj(a[i]));
32430 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32440 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
32450 7b 0a 20 20 20 20 20 20 54 63 6c 5f 50 61 6e 69  {.      Tcl_Pani
32460 63 28 22 44 65 6c 69 62 65 72 61 74 65 20 70 61  c("Deliberate pa
32470 6e 69 63 22 29 3b 0a 20 20 20 20 20 20 62 72 65  nic");.      bre
32480 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
32490 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
324a0 20 20 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64    ../*.** tclcmd
324b0 3a 20 20 20 72 65 67 69 73 74 65 72 5f 64 62 73  :   register_dbs
324c0 74 61 74 5f 76 74 61 62 20 44 42 0a 2a 2a 0a 2a  tat_vtab DB.**.*
324d0 2a 20 43 61 75 73 65 20 74 68 65 20 64 62 73 74  * Cause the dbst
324e0 61 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  at virtual table
324f0 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
32500 20 6f 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   on the connecti
32510 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  on DB.*/.static 
32520 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65  int test_registe
32530 72 5f 64 62 73 74 61 74 5f 76 74 61 62 28 0a 20  r_dbstat_vtab(. 
32540 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
32550 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
32560 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
32570 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
32580 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
32590 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
325a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
325b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
325c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 62 73 74  lt(interp, "dbst
325d0 61 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  at not available
325e0 20 62 65 63 61 75 73 65 20 6f 66 20 22 0a 20 20   because of ".  
325f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32600 20 20 20 20 20 20 20 20 20 22 53 51 4c 49 54 45           "SQLITE
32610 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
32620 4c 45 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  LE", (void*)0);.
32630 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
32640 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  OR;.#else.  stru
32650 63 74 20 53 71 6c 69 74 65 44 62 20 7b 20 73 71  ct SqliteDb { sq
32660 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b 0a 20 20  lite3 *db; };.  
32670 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 54 63 6c  char *zDb;.  Tcl
32680 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
32690 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
326a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
326b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
326c0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
326d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
326e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44  ERROR;.  }..  zD
326f0 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
32700 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 69 66  g(objv[1]);.  if
32710 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64  ( Tcl_GetCommand
32720 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
32730 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
32740 20 20 20 73 71 6c 69 74 65 33 2a 20 64 62 20 3d     sqlite3* db =
32750 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
32760 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
32770 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
32780 20 20 20 20 73 71 6c 69 74 65 33 44 62 73 74 61      sqlite3Dbsta
32790 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20  tRegister(db);. 
327a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
327b0 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  OK;.#endif /* SQ
327c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
327d0 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  LTABLE */.}../*.
327e0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c  ** tclcmd:   sql
327f0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 44  ite3_db_config D
32800 42 20 53 45 54 54 49 4e 47 20 56 41 4c 55 45 0a  B SETTING VALUE.
32810 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  **.** Invoke sql
32820 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29  ite3_db_config()
32830 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
32840 73 65 74 74 69 6e 67 20 76 61 6c 75 65 73 2e 0a  setting values..
32850 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
32860 73 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  st_sqlite3_db_co
32870 6e 66 69 67 28 0a 20 20 76 6f 69 64 20 2a 63 6c  nfig(.  void *cl
32880 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
32890 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
328a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
328b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
328c0 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  v[].){.  static 
328d0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
328e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
328f0 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 65 56  Name;.    int eV
32900 61 6c 3b 0a 20 20 7d 20 61 53 65 74 74 69 6e 67  al;.  } aSetting
32910 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 46 4b  [] = {.    { "FK
32920 45 59 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  EY",            
32930 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
32940 45 4e 41 42 4c 45 5f 46 4b 45 59 20 7d 2c 0a 20  ENABLE_FKEY },. 
32950 20 20 20 7b 20 22 54 52 49 47 47 45 52 22 2c 20     { "TRIGGER", 
32960 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
32970 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
32980 52 49 47 47 45 52 20 7d 2c 0a 20 20 20 20 7b 20  RIGGER },.    { 
32990 22 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 22  "FTS3_TOKENIZER"
329a0 2c 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ,  SQLITE_DBCONF
329b0 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  IG_ENABLE_FTS3_T
329c0 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20 20  OKENIZER },.    
329d0 7b 20 22 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  { "LOAD_EXTENSIO
329e0 4e 22 2c 20 20 53 51 4c 49 54 45 5f 44 42 43 4f  N",  SQLITE_DBCO
329f0 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  NFIG_ENABLE_LOAD
32a00 5f 45 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a 20 20  _EXTENSION },.  
32a10 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  };.  int i;.  in
32a20 74 20 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t v;.  const cha
32a30 72 20 2a 7a 53 65 74 74 69 6e 67 3b 0a 20 20 73  r *zSetting;.  s
32a40 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
32a50 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
32a60 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
32a70 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
32a80 6a 76 2c 20 22 44 42 20 53 45 54 54 49 4e 47 20  jv, "DB SETTING 
32a90 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74  VALUE");.    ret
32aa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32ab0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
32ac0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
32ad0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
32ae0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
32af0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32b00 20 7a 53 65 74 74 69 6e 67 20 3d 20 54 63 6c 5f   zSetting = Tcl_
32b10 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
32b20 5d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ]);.  if( sqlite
32b30 33 5f 73 74 72 67 6c 6f 62 28 22 53 51 4c 49 54  3_strglob("SQLIT
32b40 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d  E_*", zSetting)=
32b50 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d  =0 ) zSetting +=
32b60 20 37 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   7;.  if( sqlite
32b70 33 5f 73 74 72 67 6c 6f 62 28 22 44 42 43 4f 4e  3_strglob("DBCON
32b80 46 49 47 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67  FIG_*", zSetting
32b90 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20  )==0 ) zSetting 
32ba0 2b 3d 20 39 3b 0a 20 20 69 66 28 20 73 71 6c 69  += 9;.  if( sqli
32bb0 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 45 4e 41  te3_strglob("ENA
32bc0 42 4c 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67  BLE_*", zSetting
32bd0 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20  )==0 ) zSetting 
32be0 2b 3d 20 37 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  += 7;.  for(i=0;
32bf0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 65   i<ArraySize(aSe
32c00 74 74 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a 20 20  tting); i++){.  
32c10 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65    if( strcmp(zSe
32c20 74 74 69 6e 67 2c 20 61 53 65 74 74 69 6e 67 5b  tting, aSetting[
32c30 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
32c40 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
32c50 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 53 65  i>=ArraySize(aSe
32c60 74 74 69 6e 67 29 20 29 7b 0a 20 20 20 20 54 63  tting) ){.    Tc
32c70 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
32c80 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 54 63 6c  nterp,.      Tcl
32c90 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75  _NewStringObj("u
32ca0 6e 6b 6e 6f 77 6e 20 73 71 6c 69 74 65 33 5f 64  nknown sqlite3_d
32cb0 62 5f 63 6f 6e 66 69 67 20 73 65 74 74 69 6e 67  b_config setting
32cc0 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74  ", -1));.    ret
32cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32ce0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
32cf0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
32d00 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 29 20  p, objv[3], &v) 
32d10 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
32d20 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62  OR;.  sqlite3_db
32d30 5f 63 6f 6e 66 69 67 28 64 62 2c 20 61 53 65 74  _config(db, aSet
32d40 74 69 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20 76 2c  ting[i].eVal, v,
32d50 20 26 76 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   &v);.  Tcl_SetO
32d60 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
32d70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
32d80 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
32d90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
32da0 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20  gister commands 
32db0 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
32dc0 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
32dd0 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
32de0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
32df0 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20  terp){.  extern 
32e00 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
32e10 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ch_count;.  exte
32e20 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
32e30 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  ound_count;.  ex
32e40 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
32e50 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
32e60 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
32e70 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65  qlite3_open_file
32e80 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
32e90 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72   int sqlite3_sor
32ea0 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  t_count;.  exter
32eb0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  n int sqlite3_cu
32ec0 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20  rrent_time;.#if 
32ed0 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26  SQLITE_OS_UNIX &
32ee0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
32ef0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
32f00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
32f10 59 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  YLE.  extern int
32f20 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
32f30 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78  num;.#endif.  ex
32f40 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
32f50 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20  _max_blobsize;. 
32f60 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
32f70 74 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61  te3BtreeSharedCa
32f80 63 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c  cheReport(void*,
32f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fb0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
32fc0 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f  nterp*,int,Tcl_O
32fd0 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74  bj*CONST*);.  st
32fe0 61 74 69 63 20 69 6e 74 20 69 5a 65 72 6f 20 3d  atic int iZero =
32ff0 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   0;.  static str
33000 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
33010 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
33020 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  _CmdProc *xProc;
33030 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a  .  } aCmd[] = {.
33040 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72       { "db_enter
33050 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33060 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
33070 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20  Proc*)db_enter  
33080 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
33090 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65       { "db_leave
330a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
330b0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
330c0 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20  Proc*)db_leave  
330d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
330e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
330f0 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20  mprintf_int",   
33100 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
33110 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
33120 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a  rintf_int    },.
33130 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33140 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20  mprintf_int64", 
33150 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
33160 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
33170 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a  rintf_int64  },.
33180 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33190 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20  mprintf_long",  
331a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
331b0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
331c0 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a  rintf_long   },.
331d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
331e0 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  mprintf_str",   
331f0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
33200 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
33210 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a  rintf_str    },.
33220 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33230 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20  snprintf_str",  
33240 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
33250 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e  Proc*)sqlite3_sn
33260 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a  printf_str   },.
33270 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33280 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22  mprintf_stronly"
33290 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
332a0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
332b0 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a  rintf_stronly},.
332c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
332d0 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c  mprintf_double",
332e0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
332f0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
33300 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a  rintf_double },.
33310 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33320 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c  mprintf_scaled",
33330 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
33340 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
33350 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a  rintf_scaled },.
33360 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33370 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c  mprintf_hexdoubl
33380 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72  e",   (Tcl_CmdPr
33390 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
333a0 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a  ntf_hexdouble},.
333b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
333c0 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c  mprintf_z_test",
333d0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
333e0 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e  Proc*)test_mprin
333f0 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20  tf_z        },. 
33400 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33410 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20  printf_n_test", 
33420 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33430 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
33440 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_n        },.  
33450 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
33460 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
33470 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
33480 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74  oc*)test_snprint
33490 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20  f_int     },.   
334a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73    { "sqlite3_las
334b0 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
334c0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
334d0 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77  c*)test_last_row
334e0 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  id       },.    
334f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
33500 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20  _printf",       
33510 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
33520 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e  *)test_exec_prin
33530 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  tf      },.     
33540 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
33550 68 65 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  hex",           
33560 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
33570 29 74 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20  )test_exec_hex  
33580 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
33590 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c   "sqlite3_exec",
335a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335b0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
335c0 74 65 73 74 5f 65 78 65 63 20 20 20 20 20 20 20  test_exec       
335d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
335e0 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72  "sqlite3_exec_nr
335f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33600 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
33610 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20  est_exec_nr     
33620 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20       },.#ifndef 
33630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f  SQLITE_OMIT_GET_
33640 54 41 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71  TABLE.     { "sq
33650 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
33660 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54  printf",      (T
33670 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
33680 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
33690 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  f },.#endif.    
336a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73   { "sqlite3_clos
336b0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
336c0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
336d0 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c  *)sqlite_test_cl
336e0 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ose     },.     
336f0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  { "sqlite3_close
33700 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  _v2",           
33710 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
33720 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f  )sqlite_test_clo
33730 73 65 5f 76 32 20 20 7d 2c 0a 20 20 20 20 20 7b  se_v2  },.     {
33740 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
33750 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  _function",     
33760 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
33770 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
33780 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20  tion  },.     { 
33790 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
337a0 61 67 67 72 65 67 61 74 65 22 2c 20 20 20 20 20  aggregate",     
337b0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
337c0 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65  est_create_aggre
337d0 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22  gate },.     { "
337e0 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f  sqlite_register_
337f0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
33800 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
33810 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63  st_register_func
33820 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
33830 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20 20  qlite_abort",   
33840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
33850 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
33860 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20 20  ite_abort       
33870 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
33880 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20  lite_bind",     
33890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
338a0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
338b0 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20 20 20  _bind           
338c0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65    },.     { "bre
338d0 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20  akpoint",       
338e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
338f0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
33900 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20  breakpoint      
33910 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
33920 74 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20 20  te3_key",       
33930 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
33940 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b  _CmdProc*)test_k
33950 65 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ey              
33960 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
33970 65 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20 20  e3_rekey",      
33980 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
33990 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65  CmdProc*)test_re
339a0 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20 7d  key            }
339b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
339c0 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20 20  _set_magic",    
339d0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
339e0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73  mdProc*)sqlite_s
339f0 65 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d 2c  et_magic      },
33a00 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33a10 5f 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20  _interrupt",    
33a20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
33a30 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65  dProc*)test_inte
33a40 72 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c 0a  rrupt        },.
33a50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64       { "sqlite_d
33a60 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c  elete_function",
33a70 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
33a80 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e  Proc*)delete_fun
33a90 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20  ction       },. 
33aa0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65      { "sqlite_de
33ab0 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c  lete_collation",
33ac0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33ad0 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c  roc*)delete_coll
33ae0 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20  ation      },.  
33af0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65     { "sqlite3_ge
33b00 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20  t_autocommit",  
33b10 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
33b20 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  oc*)get_autocomm
33b30 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  it        },.   
33b40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 61    { "sqlite3_sta
33b50 63 6b 5f 75 73 65 64 22 2c 20 20 20 20 20 20 20  ck_used",       
33b60 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
33b70 63 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f 75 73  c*)test_stack_us
33b80 65 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ed       },.    
33b90 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73 79   { "sqlite3_busy
33ba0 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20  _timeout",      
33bb0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
33bc0 2a 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65  *)test_busy_time
33bd0 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  out     },.     
33be0 7b 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20 20  { "printf",     
33bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c00 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
33c10 29 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20 20  )test_printf    
33c20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
33c30 20 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65   "sqlite3IoTrace
33c40 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33c50 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
33c60 73 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20 20  st_io_trace     
33c70 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 63      },.     { "c
33c80 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64  lang_sanitize_ad
33c90 64 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 28  dress",        (
33ca0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 63 6c 61  Tcl_CmdProc*)cla
33cb0 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72  ng_sanitize_addr
33cc0 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74  ess },.  };.  st
33cd0 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
33ce0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
33cf0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50       Tcl_ObjCmdP
33d00 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20  roc *xProc;.    
33d10 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
33d20 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d  a;.  } aObjCmd[]
33d30 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c   = {.     { "sql
33d40 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 22 2c  ite3_db_config",
33d50 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
33d60 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t_sqlite3_db_con
33d70 66 69 67 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  fig, 0 },.     {
33d80 20 22 62 61 64 5f 62 65 68 61 76 69 6f 72 22 2c   "bad_behavior",
33d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33da0 20 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76    test_bad_behav
33db0 69 6f 72 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a  ior,  (void*)&iZ
33dc0 65 72 6f 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72  ero },.     { "r
33dd0 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76  egister_dbstat_v
33de0 74 61 62 22 2c 20 20 20 20 20 20 20 20 20 20 74  tab",          t
33df0 65 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62 73  est_register_dbs
33e00 74 61 74 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20  tat_vtab  },.   
33e10 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e    { "sqlite3_con
33e20 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22  nection_pointer"
33e30 2c 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f  ,    get_sqlite_
33e40 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20  pointer, 0 },.  
33e50 20 20 20 7b 20 22 69 6e 74 61 72 72 61 79 5f 61     { "intarray_a
33e60 64 64 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ddr",           
33e70 20 20 20 20 20 20 74 65 73 74 5f 69 6e 74 61 72        test_intar
33e80 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20  ray_addr, 0 },. 
33e90 20 20 20 20 7b 20 22 69 6e 74 36 34 61 72 72 61      { "int64arra
33ea0 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20 20  y_addr",        
33eb0 20 20 20 20 20 20 20 74 65 73 74 5f 69 6e 74 36         test_int6
33ec0 34 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20 7d  4array_addr, 0 }
33ed0 2c 0a 20 20 20 20 20 7b 20 22 64 6f 75 62 6c 65  ,.     { "double
33ee0 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20  array_addr",    
33ef0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64            test_d
33f00 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72 2c  oublearray_addr,
33f10 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65   0 },.     { "te
33f20 78 74 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20  xtarray_addr",  
33f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
33f40 73 74 5f 74 65 78 74 61 72 72 61 79 5f 61 64 64  st_textarray_add
33f50 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  r, 0 },.     { "
33f60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
33f70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33f80 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20  test_bind_int,  
33f90 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
33fa0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65  "sqlite3_bind_ze
33fb0 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  roblob",        
33fc0 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
33fd0 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  lob, 0 },.     {
33fe0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a   "sqlite3_bind_z
33ff0 65 72 6f 62 6c 6f 62 36 34 22 2c 20 20 20 20 20  eroblob64",     
34000 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f    test_bind_zero
34010 62 6c 6f 62 36 34 2c 20 30 20 7d 2c 0a 20 20 20  blob64, 0 },.   
34020 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
34030 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  d_int64",       
34040 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
34050 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20  nt64,    0 },.  
34060 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
34070 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  nd_double",     
34080 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
34090 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20  double,   0 },. 
340a0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
340b0 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20  ind_null",      
340c0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
340d0 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a  _null     ,0 },.
340e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
340f0 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20  bind_text",     
34100 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
34110 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c  d_text     ,0 },
34120 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34130 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20  _bind_text16",  
34140 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
34150 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d  nd_text16   ,0 }
34160 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34170 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20  3_bind_blob",   
34180 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
34190 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20  ind_blob     ,0 
341a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
341b0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
341c0 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f  r_count",  test_
341d0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
341e0 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ount, 0},.     {
341f0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
34200 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20  arameter_name", 
34210 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
34220 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c  meter_name,  0},
34230 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34240 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
34250 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69  index",  test_bi
34260 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
34270 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  ex, 0},.     { "
34280 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
34290 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20  ndings",        
342a0 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
342b0 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  ngs, 0},.     { 
342c0 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  "sqlite3_clear_b
342d0 69 6e 64 69 6e 67 73 5f 6e 75 6c 6c 22 2c 20 20  indings_null",  
342e0 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
342f0 69 6e 67 73 5f 6e 75 6c 6c 2c 20 30 7d 2c 0a 20  ings_null, 0},. 
34300 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
34310 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
34320 20 20 20 20 20 20 20 74 65 73 74 5f 73 6c 65 65         test_slee
34330 70 2c 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a  p,          0},.
34340 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34350 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20  errcode",       
34360 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
34370 63 6f 64 65 20 20 20 20 20 20 20 2c 30 20 7d 2c  code       ,0 },
34380 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34390 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
343a0 65 22 2c 20 20 20 20 20 20 74 65 73 74 5f 65 78  e",      test_ex
343b0 5f 65 72 72 63 6f 64 65 20 20 20 20 2c 30 20 7d  _errcode    ,0 }
343c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
343d0 33 5f 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20  3_errmsg",      
343e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65            test_e
343f0 72 72 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20  rrmsg        ,0 
34400 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34410 65 33 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20  e3_errmsg16",   
34420 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
34430 65 72 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30  errmsg16      ,0
34440 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
34450 74 65 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20  te3_open",      
34460 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
34470 5f 6f 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c  _open          ,
34480 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
34490 69 74 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20  ite3_open16",   
344a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
344b0 74 5f 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20  t_open16        
344c0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
344d0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20  lite3_open_v2", 
344e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
344f0 73 74 5f 6f 70 65 6e 5f 76 32 20 20 20 20 20 20  st_open_v2      
34500 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
34510 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31  qlite3_complete1
34520 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  6",            t
34530 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20  est_complete16  
34540 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20    ,0 },..     { 
34550 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
34560 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
34570 20 74 65 73 74 5f 70 72 65 70 61 72 65 20 20 20   test_prepare   
34580 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
34590 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
345a0 65 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  e16",           
345b0 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36    test_prepare16
345c0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
345d0 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
345e0 72 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  re_v2",         
345f0 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f     test_prepare_
34600 76 32 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  v2    ,0 },.    
34610 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
34620 61 72 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20  are_tkt3134",   
34630 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
34640 5f 74 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20  _tkt3134, 0},.  
34650 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
34660 65 70 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20  epare16_v2",    
34670 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
34680 72 65 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20  re16_v2  ,0 },. 
34690 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66      { "sqlite3_f
346a0 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20  inalize",       
346b0 20 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61         test_fina
346c0 6c 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a  lize      ,0 },.
346d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
346e0 73 74 6d 74 5f 73 74 61 74 75 73 22 2c 20 20 20  stmt_status",   
346f0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d          test_stm
34700 74 5f 73 74 61 74 75 73 20 20 20 2c 30 20 7d 2c  t_status   ,0 },
34710 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34720 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20  _reset",        
34730 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65           test_re
34740 73 65 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d  set         ,0 }
34750 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34760 33 5f 65 78 70 69 72 65 64 22 2c 20 20 20 20 20  3_expired",     
34770 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65            test_e
34780 78 70 69 72 65 64 20 20 20 20 20 20 20 2c 30 20  xpired       ,0 
34790 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
347a0 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  e3_transfer_bind
347b0 69 6e 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f  ings",     test_
347c0 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30  transfer_bind ,0
347d0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
347e0 74 65 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20  te3_changes",   
347f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
34800 5f 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c  _changes       ,
34810 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
34820 69 74 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20  ite3_step",     
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
34840 74 5f 73 74 65 70 20 20 20 20 20 20 20 20 20 20  t_step          
34850 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
34860 6c 69 74 65 33 5f 73 71 6c 22 2c 20 20 20 20 20  lite3_sql",     
34870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
34880 73 74 5f 73 71 6c 20 20 20 20 20 20 20 20 20 20  st_sql          
34890 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
348a0 71 6c 69 74 65 33 5f 65 78 70 61 6e 64 65 64 5f  qlite3_expanded_
348b0 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 74  sql",          t
348c0 65 73 74 5f 65 78 5f 73 71 6c 20 20 20 20 20 20  est_ex_sql      
348d0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
348e0 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d  sqlite3_next_stm
348f0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
34900 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20  test_next_stmt  
34910 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
34920 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65  "sqlite3_stmt_re
34930 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20  adonly",        
34940 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f   test_stmt_reado
34950 6e 6c 79 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  nly ,0 },.     {
34960 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62   "sqlite3_stmt_b
34970 75 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  usy",           
34980 20 20 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79    test_stmt_busy
34990 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
349a0 7b 20 22 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  { "uses_stmt_jou
349b0 72 6e 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20  rnal",          
349c0 20 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75     uses_stmt_jou
349d0 72 6e 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20  rnal ,0 },..    
349e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6c 65   { "sqlite3_rele
349f0 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20  ase_memory",    
34a00 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61 73 65      test_release
34a10 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c  _memory,     0},
34a20 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34a30 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
34a40 72 79 22 2c 20 20 20 20 20 74 65 73 74 5f 64 62  ry",     test_db
34a50 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
34a60 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
34a70 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c  lite3_db_cachefl
34a80 75 73 68 22 2c 20 20 20 20 20 20 20 20 20 74 65  ush",         te
34a90 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68  st_db_cacheflush
34aa0 2c 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  ,      0},.     
34ab0 7b 20 22 73 71 6c 69 74 65 33 5f 73 79 73 74 65  { "sqlite3_syste
34ac0 6d 5f 65 72 72 6e 6f 22 2c 20 20 20 20 20 20 20  m_errno",       
34ad0 20 20 20 74 65 73 74 5f 73 79 73 74 65 6d 5f 65     test_system_e
34ae0 72 72 6e 6f 2c 20 20 20 20 20 20 20 30 7d 2c 0a  rrno,       0},.
34af0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34b00 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20  db_filename",   
34b10 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f          test_db_
34b20 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  filename,       
34b30 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
34b40 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
34b50 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
34b60 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20  t_db_readonly,  
34b70 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
34b80 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68   "sqlite3_soft_h
34b90 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20  eap_limit",     
34ba0 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70    test_soft_heap
34bb0 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20  _limit,    0},. 
34bc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
34bd0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20  hread_cleanup", 
34be0 20 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65         test_thre
34bf0 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20  ad_cleanup,     
34c00 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
34c10 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
34c20 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  nts",       test
34c30 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
34c40 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b  ,    0},..     {
34c50 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65   "sqlite3_load_e
34c60 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20  xtension",      
34c70 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65    test_load_exte
34c80 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20  nsion,     0},. 
34c90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
34ca0 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
34cb0 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62  sion", test_enab
34cc0 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  le_load,        
34cd0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
34ce0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
34cf0 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74  ult_codes", test
34d00 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
34d10 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20  _codes, 0},.    
34d20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69   { "sqlite3_limi
34d30 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
34d40 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20      test_limit, 
34d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d60 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76  0},..     { "sav
34d70 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  e_prng_state",  
34d80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
34d90 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20  e_prng_state,   
34da0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
34db0 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
34dc0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ",            re
34dd0 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
34de0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72  , 0 },.     { "r
34df0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22  eset_prng_state"
34e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  ,              r
34e10 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c  eset_prng_state,
34e20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
34e30 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63  database_never_c
34e40 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  orrupt",        
34e50 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63  database_never_c
34e60 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20  orrupt, 0},.    
34e70 20 7b 20 22 64 61 74 61 62 61 73 65 5f 6d 61 79   { "database_may
34e80 5f 62 65 5f 63 6f 72 72 75 70 74 22 2c 20 20 20  _be_corrupt",   
34e90 20 20 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79      database_may
34ea0 5f 62 65 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c  _be_corrupt, 0},
34eb0 0a 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a  .     { "optimiz
34ec0 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20  ation_control", 
34ed0 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
34ee0 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d  ation_control,0}
34ef0 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ,.#if SQLITE_OS_
34f00 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b  WIN.     { "lock
34f10 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20  _win32_file",   
34f20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
34f30 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20  2_file_lock,    
34f40 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 65 78 69  0 },.     { "exi
34f50 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c  sts_win32_path",
34f60 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
34f70 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68 2c 20  32_exists_path, 
34f80 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69   0 },.     { "fi
34f90 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20  nd_win32_file", 
34fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
34fb0 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20  n32_find_file,  
34fc0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64    0 },.     { "d
34fd0 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65  elete_win32_file
34fe0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 77  ",             w
34ff0 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65  in32_delete_file
35000 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ,  0 },.     { "
35010 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c  make_win32_dir",
35020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35030 77 69 6e 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20  win32_mkdir,    
35040 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
35050 22 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69  "remove_win32_di
35060 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
35070 20 77 69 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20   win32_rmdir,   
35080 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
35090 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a  .     { "tcl_obj
350a0 70 72 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  proc",          
350b0 20 20 20 20 20 20 20 20 20 72 75 6e 41 73 4f 62           runAsOb
350c0 6a 50 72 6f 63 2c 20 20 20 20 20 20 20 30 20 7d  jProc,       0 }
350d0 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ,..     /* sqlit
350e0 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50  e3_column_*() AP
350f0 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c  I */.     { "sql
35100 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
35110 74 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  t",          tes
35120 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20  t_column_count  
35130 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
35140 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
35150 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
35160 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20  st_data_count   
35170 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
35180 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
35190 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  pe",           t
351a0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  est_column_type 
351b0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
351c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
351d0 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
351e0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  test_column_blob
351f0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
35200 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
35210 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
35220 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75   test_column_dou
35230 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ble ,0 },.     {
35240 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
35250 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
35260 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e    test_column_in
35270 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  t64  ,0 },.     
35280 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
35290 6e 5f 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f  n_text",   test_
352a0 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69  stmt_utf8,  (voi
352b0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
352c0 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b  n_text },.     {
352d0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
352e0 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73  _name",   test_s
352f0 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64  tmt_utf8,  (void
35300 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
35310 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20  _name },.     { 
35320 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
35330 69 6e 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74  int",    test_st
35340 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a  mt_int,   (void*
35350 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
35360 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  int  },.     { "
35370 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
35380 79 74 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d  ytes",  test_stm
35390 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29  t_int,   (void*)
353a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
353b0 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53  ytes},.#ifndef S
353c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
353d0 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  YPE.     { "sqli
353e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
353f0 79 70 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ype",test_stmt_u
35400 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
35410 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
35420 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  pe},.#endif.#ifd
35430 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35440 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
35450 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  .{ "sqlite3_colu
35460 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
35470 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
35480 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
35490 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
354a0 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65  name},.{ "sqlite
354b0 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
354c0 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
354d0 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
354e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
354f0 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65  name},.{ "sqlite
35500 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
35510 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f  name",test_stmt_
35520 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69  utf8,(void*)sqli
35530 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
35540 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a  n_name},.#endif.
35550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35560 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20  OMIT_UTF16.     
35570 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
35580 6e 5f 62 79 74 65 73 31 36 22 2c 20 74 65 73 74  n_bytes16", test
35590 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64  _stmt_int, (void
355a0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
355b0 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20  _bytes16 },.    
355c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
355d0 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73  mn_text16",  tes
355e0 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
355f0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
35600 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20  umn_text16},.   
35610 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
35620 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65  umn_name16",  te
35630 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
35640 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
35650 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20  lumn_name16},.  
35660 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d     { "add_alignm
35670 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69  ent_test_collati
35680 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d  ons", add_alignm
35690 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69  ent_test_collati
356a0 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23  ons, 0      },.#
356b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
356c0 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20  IT_DECLTYPE.    
356d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
356e0 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74  mn_decltype16",t
356f0 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28  est_stmt_utf16,(
35700 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
35710 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d  lumn_decltype16}
35720 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
35730 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
35740 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22  LUMN_METADATA.{"
35750 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
35760 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c  atabase_name16",
35770 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  .  test_stmt_utf
35780 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
35790 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
357a0 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71  se_name16},.{"sq
357b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
357c0 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74  le_name16", test
357d0 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
357e0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
357f0 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d  mn_table_name16}
35800 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,.{"sqlite3_colu
35810 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36  mn_origin_name16
35820 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
35830 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
35840 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
35850 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66  _name16},.#endif
35860 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
35870 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
35880 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65  ollation_v2", te
35890 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  st_create_collat
358a0 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20  ion_v2, 0 },.   
358b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f    { "sqlite3_glo
358c0 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20  bal_recover",   
358d0 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65    test_global_re
358e0 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20  cover, 0   },.  
358f0 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34     { "working_64
35900 62 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  bit_int",       
35910 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74     working_64bit
35920 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  _int,   0   },. 
35930 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e      { "vfs_unlin
35940 6b 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  k_test",        
35950 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74      vfs_unlink_t
35960 65 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  est,     0   },.
35970 20 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74       { "vfs_init
35980 66 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20  fail_test",     
35990 20 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69       vfs_initfai
359a0 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c  l_test,   0   },
359b0 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72  .     { "vfs_unr
359c0 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20  egister_all",   
359d0 20 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69        vfs_unregi
359e0 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d  ster_all,  0   }
359f0 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65  ,.     { "vfs_re
35a00 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20  register_all",  
35a10 20 20 20 20 20 20 20 76 66 73 5f 72 65 72 65 67         vfs_rereg
35a20 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20  ister_all,  0   
35a30 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
35a40 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20  control_test",  
35a50 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e          file_con
35a60 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20  trol_test,   0  
35a70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
35a80 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
35a90 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63  no_test", file_c
35aa0 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
35ab0 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20  _test,  0   },. 
35ac0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
35ad0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
35ae0 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  st", file_contro
35af0 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
35b00 2c 20 20 30 20 20 20 7d 2c 0a 23 69 66 64 65 66  ,  0   },.#ifdef
35b10 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 20 20 20   __APPLE__.     
35b20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
35b30 74 72 75 6e 63 61 74 65 5f 74 65 73 74 22 2c 20  truncate_test", 
35b40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72 75  file_control_tru
35b50 6e 63 61 74 65 5f 74 65 73 74 2c 20 20 30 20 20  ncate_test,  0  
35b60 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
35b70 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65  _control_replace
35b80 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
35b90 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f 74 65 73  trol_replace_tes
35ba0 74 2c 20 20 30 20 20 20 7d 2c 0a 23 65 6e 64 69  t,  0   },.#endi
35bb0 66 20 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  f .     { "file_
35bc0 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a  control_chunksiz
35bd0 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  e_test", file_co
35be0 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
35bf0 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20  test,  0   },.  
35c00 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
35c10 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74  ol_sizehint_test
35c20 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ",  file_control
35c30 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c 20  _sizehint_test, 
35c40 20 20 30 20 20 20 7d 2c 0a 23 69 66 20 53 51 4c    0   },.#if SQL
35c50 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20  ITE_OS_WIN.     
35c60 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
35c70 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 22 2c  win32_av_retry",
35c80 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
35c90 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20 20 30  n32_av_retry,  0
35ca0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
35cb0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
35cc0 5f 73 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66 69  _set_handle", fi
35cd0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
35ce0 5f 73 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20 20  _set_handle, 0  
35cf0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
35d00 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70   "file_control_p
35d10 65 72 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20  ersist_wal",    
35d20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
35d30 73 69 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20  sist_wal,     0 
35d40 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
35d50 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73  e_control_powers
35d60 61 66 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66  afe_overwrite",f
35d70 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65  ile_control_powe
35d80 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c  rsafe_overwrite,
35d90 30 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65  0},.     { "file
35da0 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65  _control_vfsname
35db0 22 2c 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63  ",        file_c
35dc0 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20  ontrol_vfsname, 
35dd0 20 20 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20          0   },. 
35de0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
35df0 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
35e00 22 2c 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  ",   file_contro
35e10 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c 20  l_tempfilename, 
35e20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
35e30 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69   "sqlite3_vfs_li
35e40 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 76  st",           v
35e50 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20  fs_list,     0  
35e60 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35e70 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
35e80 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72  ion_v2", test_cr
35e90 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
35ea0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70  , 0 },.     { "p
35eb0 61 74 68 5f 69 73 5f 6c 6f 63 61 6c 22 2c 20 20  ath_is_local",  
35ec0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
35ed0 5f 69 73 5f 6c 6f 63 61 6c 2c 20 20 30 20 20 20  _is_local,  0   
35ee0 7d 2c 0a 20 20 20 20 20 7b 20 22 70 61 74 68 5f  },.     { "path_
35ef0 69 73 5f 64 6f 73 22 2c 20 20 20 20 20 20 20 20  is_dos",        
35f00 20 20 20 20 20 20 20 20 70 61 74 68 5f 69 73 5f          path_is_
35f10 64 6f 73 2c 20 20 30 20 20 20 7d 2c 0a 0a 20 20  dos,  0   },..  
35f20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20     /* Functions 
35f30 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66  from os.h */.#if
35f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35f50 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61  _UTF16.     { "a
35f60 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  dd_test_collate"
35f70 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f  ,        test_co
35f80 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20  llate, 0        
35f90 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
35fa0 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  dd_test_collate_
35fb0 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f  needed", test_co
35fc0 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20  llate_needed, 0 
35fd0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
35fe0 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  dd_test_function
35ff0 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66 75  ",       test_fu
36000 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20  nction, 0       
36010 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
36020 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e  dd_test_utf16bin
36030 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74 65  _collate",    te
36040 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c  st_utf16bin_coll
36050 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 7d 2c  ate, 0        },
36060 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
36070 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72  sqlite3_test_err
36080 73 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65  str",     test_e
36090 72 72 73 74 72 2c 20 30 20 20 20 20 20 20 20 20  rrstr, 0        
360a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
360b0 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
360c0 65 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61  e",       tcl_va
360d0 72 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20  riable_type, 0  
360e0 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20       },.#ifndef 
360f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
36100 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b 20  ED_CACHE.     { 
36110 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  "sqlite3_enable_
36120 73 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20 74  shared_cache", t
36130 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  est_enable_share
36140 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  d, 0  },.     { 
36150 22 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f  "sqlite3_shared_
36160 63 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20 73  cache_report", s
36170 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65  qlite3BtreeShare
36180 64 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30 7d  dCacheReport, 0}
36190 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
361a0 22 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  "sqlite3_libvers
361b0 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65 73  ion_number", tes
361c0 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  t_libversion_num
361d0 62 65 72 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  ber, 0  },.     
361e0 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  { "sqlite3_table
361f0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
36200 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f  ", test_table_co
36210 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30  lumn_metadata, 0
36220 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    },.#ifndef SQL
36230 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
36240 42 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  B.     { "sqlite
36250 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20  3_blob_reopen", 
36260 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  test_blob_reopen
36270 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
36280 20 20 20 20 7b 20 22 70 63 61 63 68 65 5f 73 74      { "pcache_st
36290 61 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  ats",       test
362a0 5f 70 63 61 63 68 65 5f 73 74 61 74 73 2c 20 30  _pcache_stats, 0
362b0 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49    },.#ifdef SQLI
362c0 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
362d0 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20 7b 20 22  _NOTIFY.     { "
362e0 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
362f0 6f 74 69 66 79 22 2c 20 74 65 73 74 5f 75 6e 6c  otify", test_unl
36300 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30 20 20 7d  ock_notify, 0  }
36310 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
36320 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65  "sqlite3_wal_che
36330 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74 65 73 74  ckpoint",   test
36340 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 2c  _wal_checkpoint,
36350 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   0  },.     { "s
36360 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
36370 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73 74 5f 77  point_v2",test_w
36380 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
36390 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
363a0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
363b0 63 68 65 63 6b 70 6f 69 6e 74 22 2c 74 65 73 74  checkpoint",test
363c0 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
363d0 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  int, 0  },.     
363e0 7b 20 22 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  { "test_sqlite3_
363f0 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74 65  log",         te
36400 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20  st_sqlite3_log, 
36410 30 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51  0  },.#ifndef SQ
36420 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
36430 4e 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 5f  N.     { "print_
36440 65 78 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c  explain_query_pl
36450 61 6e 22 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f  an", test_print_
36460 65 71 70 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  eqp, 0  },.#endi
36470 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
36480 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c  3_test_control",
36490 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72   test_test_contr
364a0 6f 6c 20 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45  ol },.#if SQLITE
364b0 5f 4f 53 5f 55 4e 49 58 0a 20 20 20 20 20 7b 20  _OS_UNIX.     { 
364c0 22 67 65 74 72 75 73 61 67 65 22 2c 20 74 65 73  "getrusage", tes
364d0 74 5f 67 65 74 72 75 73 61 67 65 20 7d 2c 0a 23  t_getrusage },.#
364e0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 6c 6f  endif.     { "lo
364f0 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73  ad_static_extens
36500 69 6f 6e 22 2c 20 74 63 6c 4c 6f 61 64 53 74 61  ion", tclLoadSta
36510 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 20  ticExtensionCmd 
36520 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65  },.     { "sorte
36530 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 22  r_test_fakeheap"
36540 2c 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61  , sorter_test_fa
36550 6b 65 68 65 61 70 20 7d 2c 0a 20 20 20 20 20 7b  keheap },.     {
36560 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f   "sorter_test_so
36570 72 74 34 5f 68 65 6c 70 65 72 22 2c 20 73 6f 72  rt4_helper", sor
36580 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68  ter_test_sort4_h
36590 65 6c 70 65 72 20 7d 2c 0a 23 69 66 64 65 66 20  elper },.#ifdef 
365a0 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
365b0 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
365c0 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  { "sqlite3_user_
365d0 61 75 74 68 65 6e 74 69 63 61 74 65 22 2c 20 74  authenticate", t
365e0 65 73 74 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  est_user_authent
365f0 69 63 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20  icate, 0 },.    
36600 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72   { "sqlite3_user
36610 5f 61 64 64 22 2c 20 20 20 20 20 20 20 20 20 20  _add",          
36620 74 65 73 74 5f 75 73 65 72 5f 61 64 64 2c 20 20  test_user_add,  
36630 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20          0 },.   
36640 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65    { "sqlite3_use
36650 72 5f 63 68 61 6e 67 65 22 2c 20 20 20 20 20 20  r_change",      
36660 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67   test_user_chang
36670 65 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  e,       0 },.  
36680 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73     { "sqlite3_us
36690 65 72 5f 64 65 6c 65 74 65 22 2c 20 20 20 20 20  er_delete",     
366a0 20 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65    test_user_dele
366b0 74 65 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  te,       0 },.#
366c0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
366d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
366e0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
366f0 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
36700 73 63 61 6e 73 74 61 74 75 73 22 2c 20 20 20 20  scanstatus",    
36710 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61     test_stmt_sca
36720 6e 73 74 61 74 75 73 2c 20 20 20 30 20 7d 2c 0a  nstatus,   0 },.
36730 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36740 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f  stmt_scanstatus_
36750 72 65 73 65 74 22 2c 20 74 65 73 74 5f 73 74 6d  reset", test_stm
36760 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73  t_scanstatus_res
36770 65 74 2c 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69  et,   0 },.#endi
36780 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
36790 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
367a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
367b0 6e 66 69 67 5f 73 71 6c 6c 6f 67 22 2c 20 20 20  nfig_sqllog",   
367c0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6e 66 69        test_confi
367d0 67 5f 73 71 6c 6c 6f 67 2c 20 20 20 30 20 7d 2c  g_sqllog,   0 },
367e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
367f0 76 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  vfs_current_time
36800 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
36810 20 20 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d     vfsCurrentTim
36820 65 49 6e 74 36 34 2c 20 20 20 30 20 7d 2c 0a 23  eInt64,   0 },.#
36830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
36840 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 20 20 20  BLE_SNAPSHOT.   
36850 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 61    { "sqlite3_sna
36860 70 73 68 6f 74 5f 67 65 74 22 2c 20 74 65 73 74  pshot_get", test
36870 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 2c 20 30  _snapshot_get, 0
36880 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36890 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65  te3_snapshot_ope
368a0 6e 22 2c 20 74 65 73 74 5f 73 6e 61 70 73 68 6f  n", test_snapsho
368b0 74 5f 6f 70 65 6e 2c 20 30 20 7d 2c 0a 20 20 20  t_open, 0 },.   
368c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 61    { "sqlite3_sna
368d0 70 73 68 6f 74 5f 66 72 65 65 22 2c 20 74 65 73  pshot_free", tes
368e0 74 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 2c  t_snapshot_free,
368f0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
36900 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63  lite3_snapshot_c
36910 6d 70 22 2c 20 74 65 73 74 5f 73 6e 61 70 73 68  mp", test_snapsh
36920 6f 74 5f 63 6d 70 2c 20 30 20 7d 2c 0a 23 65 6e  ot_cmp, 0 },.#en
36930 64 69 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  dif.  };.  stati
36940 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69  c int bitmask_si
36950 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d  ze = sizeof(Bitm
36960 61 73 6b 29 2a 38 3b 0a 20 20 73 74 61 74 69 63  ask)*8;.  static
36970 20 69 6e 74 20 6c 6f 6e 67 64 6f 75 62 6c 65 5f   int longdouble_
36980 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 4c 4f  size = sizeof(LO
36990 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3b 0a  NGDOUBLE_TYPE);.
369a0 20 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72    int i;.  exter
369b0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  n int sqlite3_sy
369c0 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65  nc_count, sqlite
369d0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
369e0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
369f0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
36a00 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
36a10 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65  int sqlite3_like
36a20 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
36a30 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65   int sqlite3_xfe
36a40 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  ropt_count;.  ex
36a50 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
36a60 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
36a70 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
36a80 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
36a90 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20  writedb_count;. 
36aa0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
36ab0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
36ac0 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49  _count;.#if SQLI
36ad0 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65  TE_OS_WIN.  exte
36ae0 72 6e 20 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65  rn LONG volatile
36af0 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
36b00 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
36b10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65  SQLITE_DEBUG.  e
36b20 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
36b30 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65  3WhereTrace;.  e
36b40 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
36b50 33 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65  3OSTrace;.  exte
36b60 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61  rn int sqlite3Wa
36b70 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  lTrace;.#endif.#
36b80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
36b90 54 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  T.#ifdef SQLITE_
36ba0 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78  ENABLE_FTS3.  ex
36bb0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
36bc0 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72  _fts3_enable_par
36bd0 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66  entheses;.#endif
36be0 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69  .#endif..  for(i
36bf0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d  =0; i<sizeof(aCm
36c00 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30  d)/sizeof(aCmd[0
36c10 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  ]); i++){.    Tc
36c20 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
36c30 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e  interp, aCmd[i].
36c40 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78  zName, aCmd[i].x
36c50 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Proc, 0, 0);.  }
36c60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
36c70 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69  zeof(aObjCmd)/si
36c80 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29  zeof(aObjCmd[0])
36c90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
36ca0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
36cb0 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64  (interp, aObjCmd
36cc0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [i].zName, .    
36cd0 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78      aObjCmd[i].x
36ce0 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  Proc, aObjCmd[i]
36cf0 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b  .clientData, 0);
36d00 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  .  }.  Tcl_LinkV
36d10 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
36d20 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22  te_search_count"
36d30 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
36d40 26 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f  &sqlite3_search_
36d50 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
36d60 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
36d70 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
36d80 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22  ite_found_count"
36d90 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
36da0 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63  &sqlite3_found_c
36db0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
36dc0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
36dd0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
36de0 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20  te_sort_count", 
36df0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
36e00 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
36e10 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
36e20 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
36e30 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
36e40 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20  _max_blobsize", 
36e50 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
36e60 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
36e70 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ize, TCL_LINK_IN
36e80 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
36e90 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
36ea0 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a  e_like_count", .
36eb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
36ec0 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
36ed0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
36ee0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
36ef0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69  nterp, "sqlite_i
36f00 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c  nterrupt_count",
36f10 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
36f20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
36f30 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
36f40 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
36f50 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
36f60 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
36f70 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
36f80 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
36f90 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20  pen_file_count, 
36fa0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
36fb0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
36fc0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72  erp, "sqlite_cur
36fd0 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20  rent_time", .   
36fe0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
36ff0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c  e3_current_time,
37000 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
37010 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
37020 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  IX && defined(__
37030 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
37040 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
37050 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69  G_STYLE.  Tcl_Li
37060 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
37070 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d  qlite_hostid_num
37080 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
37090 29 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  )&sqlite3_hostid
370a0 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  _num, TCL_LINK_I
370b0 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
370c0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
370d0 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  , "sqlite3_xfero
370e0 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  pt_count",.     
370f0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
37100 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20  _xferopt_count, 
37110 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
37120 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
37130 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
37140 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
37150 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
37160 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  &sqlite3_pager_r
37170 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  eaddb_count, TCL
37180 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
37190 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
371a0 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
371b0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c  _writedb_count",
371c0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
371d0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
371e0 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  tedb_count, TCL_
371f0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
37200 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
37210 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
37220 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20  writej_count",. 
37230 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
37240 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
37250 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  j_count, TCL_LIN
37260 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20  K_INT);.#ifndef 
37270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
37280 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  6.  Tcl_LinkVar(
37290 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e  interp, "unalign
372a0 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
372b0 72 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  r",.      (char*
372c0 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  )&unaligned_stri
372d0 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f  ng_counter, TCL_
372e0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
372f0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
37300 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63  _OMIT_UTF16.  Tc
37310 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
37320 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e  , "sqlite_last_n
37330 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22  eeded_collation"
37340 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
37350 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f  pzNeededCollatio
37360 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
37370 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
37380 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23  _ONLY);.#endif.#
37390 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
373a0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
373b0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
373c0 73 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28  s_type",.      (
373d0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
373e0 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b  s_type, TCL_LINK
373f0 5f 4c 4f 4e 47 29 3b 0a 23 65 6e 64 69 66 0a 23  _LONG);.#endif.#
37400 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
37410 54 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  T.  {.    static
37420 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 71 75 65   const char *que
37430 72 79 5f 70 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f  ry_plan = "*** O
37440 42 53 4f 4c 45 54 45 20 56 41 52 49 41 42 4c 45  BSOLETE VARIABLE
37450 20 2a 2a 2a 22 3b 0a 20 20 20 20 54 63 6c 5f 4c   ***";.    Tcl_L
37460 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
37470 73 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61  sqlite_query_pla
37480 6e 22 2c 0a 20 20 20 20 20 20 20 28 63 68 61 72  n",.       (char
37490 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54  *)&query_plan, T
374a0 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54  CL_LINK_STRING|T
374b0 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
374c0 59 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  Y);.  }.#endif.#
374d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
374e0 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  UG.  Tcl_LinkVar
374f0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
37500 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20  _where_trace",. 
37510 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
37520 69 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20  ite3WhereTrace, 
37530 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
37540 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
37550 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
37560 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
37570 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54  har*)&sqlite3OST
37580 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
37590 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
375a0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54  ITE_OMIT_WAL.  T
375b0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
375c0 70 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74  p, "sqlite_wal_t
375d0 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
375e0 61 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54  ar*)&sqlite3WalT
375f0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
37600 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  NT);.#endif.#end
37610 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
37620 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
37630 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
37640 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e  rp, "sqlite_open
37650 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  temp_count",.   
37660 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
37670 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
37680 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
37690 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
376a0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
376b0 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
376c0 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20  nd_value",.     
376d0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
376e0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
376f0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  e, TCL_LINK_STRI
37700 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
37710 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
37720 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
37730 62 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68  byte",.      (ch
37740 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
37750 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54  ic_bind_nbyte, T
37760 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
37770 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
37780 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  rp, "sqlite_temp
37790 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20  _directory",.   
377a0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
377b0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
377c0 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  y, TCL_LINK_STRI
377d0 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
377e0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
377f0 74 65 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  te_data_director
37800 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  y",.      (char*
37810 29 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  )&sqlite3_data_d
37820 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49  irectory, TCL_LI
37830 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63  NK_STRING);.  Tc
37840 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
37850 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22  , "bitmask_size"
37860 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
37870 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43  bitmask_size, TC
37880 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c  L_LINK_INT|TCL_L
37890 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a  INK_READ_ONLY);.
378a0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
378b0 74 65 72 70 2c 20 22 6c 6f 6e 67 64 6f 75 62 6c  terp, "longdoubl
378c0 65 5f 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 28  e_size",.      (
378d0 63 68 61 72 2a 29 26 6c 6f 6e 67 64 6f 75 62 6c  char*)&longdoubl
378e0 65 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  e_size, TCL_LINK
378f0 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  _INT|TCL_LINK_RE
37900 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f  AD_ONLY);.  Tcl_
37910 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
37920 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75  "sqlite_sync_cou
37930 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
37940 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  *)&sqlite3_sync_
37950 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
37960 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
37970 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
37980 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  ite_fullsync_cou
37990 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
379a0 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  *)&sqlite3_fulls
379b0 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ync_count, TCL_L
379c0 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65  INK_INT);.#if de
379d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
379e0 42 4c 45 5f 46 54 53 33 29 20 26 26 20 64 65 66  BLE_FTS3) && def
379f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
37a00 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ).  Tcl_LinkVar(
37a10 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
37a20 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
37a30 6e 74 68 65 73 65 73 22 2c 0a 20 20 20 20 20 20  ntheses",.      
37a40 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
37a50 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
37a60 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e  ntheses, TCL_LIN
37a70 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
37a80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
37a90 7d 0a                                            }.