/ Hex Artifact Content
Login

Artifact d019682c4480d612e4eca73412011a120e1468db:


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 6e 63 6c 75 64 65 20 22  nt.h".#include "
0240: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0250: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0260: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0270: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0280: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
0290: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02a0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02b0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02c0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
02d0: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
02e0: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
02f0: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0300: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0310: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0320: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0330: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0340: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0350: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0360: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
0370: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
0380: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
0390: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03a0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03b0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03c0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
03d0: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
03e0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
03f0: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0400: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0410: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0420: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0430: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0440: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0450: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0460: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
0470: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
0480: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
0490: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04a0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04b0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04c0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
04d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
04e0: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
04f0: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0500: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0510: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0520: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0530: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0540: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0550: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0560: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
0570: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
0580: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
0590: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05a0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05c0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
05d0: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
05e0: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
05f0: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0600: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0610: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0620: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0630: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0640: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0650: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0660: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
0670: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
0680: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
0690: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06a0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06b0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06c0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
06d0: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
06e0: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
06f0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0700: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0710: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0720: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0730: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0740: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0750: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0760: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
0770: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
0780: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
0790: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07b0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07c0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
07d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
07e0: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
07f0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0800: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0810: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0820: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0830: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0840: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0850: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0860: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
0870: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
0880: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
0890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08a0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08b0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08c0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
08d0: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
08e0: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
08f0: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0900: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0910: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0920: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0930: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0950: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0960: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0970: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0980: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0990: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09a0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09b0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09c0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
09d0: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
09e0: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
09f0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a00: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a10: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a20: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a30: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a40: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a50: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a60: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0a70: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0a80: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0a90: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0aa0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ab0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0ac0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0ad0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74  CL_OK;.}...const
0ae0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 54 65   char *sqlite3Te
0af0: 73 74 45 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20  stErrorName(int 
0b00: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
0b10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
0b20: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
0b30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
0b40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
0b50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0b60: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
0b70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0b80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
0b90: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
0ba0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0bb0: 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20  TE_ERROR";      
0bc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0bd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0be0: 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20  TERNAL:         
0bf0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c00: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
0c10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
0c30: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
0c40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c50: 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20  TE_PERM";       
0c60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
0c80: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
0c90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0ca0: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
0cb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0cc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
0cd0: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
0ce0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0cf0: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
0d00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0d20: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
0d30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0d40: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
0d50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0d70: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
0d80: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
0d90: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
0da0: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
0db0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0dc0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
0dd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0de0: 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  TE_NOMEM";      
0df0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0e00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
0e10: 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20  ADONLY:         
0e20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e30: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
0e40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0e50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0e60: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
0e70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e80: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
0e90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ea0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
0eb0: 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ERR:            
0ec0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0ed0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
0ee0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ef0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
0f00: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
0f10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f20: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
0f30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0f40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0f50: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
0f60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f70: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
0f80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0f90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
0fa0: 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
0fb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0fc0: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
0fd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0fe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
0ff0: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
1000: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1010: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
1020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
1040: 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20  OTOCOL:         
1050: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1060: 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20  TE_PROTOCOL";   
1070: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
1090: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
10a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
10b0: 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20  TE_EMPTY";      
10c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43    case SQLITE_SC
10e0: 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20  HEMA:           
10f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1100: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
1110: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1120: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
1130: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
1140: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1150: 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20  TE_TOOBIG";     
1160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1180: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
1190: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
11a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
11b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
11d0: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
11e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
11f0: 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20  TE_MISMATCH";   
1200: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1210: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
1220: 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20  SUSE:           
1230: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1240: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
1250: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1260: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
1270: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
1280: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1290: 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20  TE_NOLFS";      
12a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
12c0: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
12d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
12e0: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
12f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1300: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
1310: 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20  RMAT:           
1320: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1330: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
1340: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1350: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41    case SQLITE_RA
1360: 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  NGE:            
1370: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1380: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
1390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
13b0: 54 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20  TADB:           
13c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
13d0: 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20  TE_NOTADB";     
13e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
1400: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
1410: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1420: 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20  TE_ROW";        
1430: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1440: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
1450: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  NE:             
1460: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1470: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
1480: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1490: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
14a0: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
14b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
14c0: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20  TE_IOERR_READ"; 
14d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
14f0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
1500: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1510: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1520: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
1530: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1540: 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20  ERR_WRITE:      
1550: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1560: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
1570: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1580: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1590: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
15a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
15b0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b  TE_IOERR_FSYNC";
15c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
15e0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20  ERR_DIR_FSYNC:  
15f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1600: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
1610: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
1620: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1630: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
1640: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1650: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1660: 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  E";    break;.  
1670: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1680: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
1690: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
16a0: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
16b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
16d0: 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20  ERR_UNLOCK:     
16e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
16f0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
1700: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1710: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1720: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
1730: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1740: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22  TE_IOERR_RDLOCK"
1750: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1760: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1770: 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20  ERR_DELETE:     
1780: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1790: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
17a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
17b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
17c0: 45 52 52 5f 42 4c 4f 43 4b 45 44 3a 20 20 20 20  ERR_BLOCKED:    
17d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
17e0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
17f0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1800: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1810: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
1820: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1830: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b  TE_IOERR_NOMEM";
1840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1850: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
1860: 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20  ERR_ACCESS:     
1870: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1880: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
1890: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
18a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
18b0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
18c0: 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  DLOCK:.         
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
18f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
1900: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20  KRESERVEDLOCK"; 
1910: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
1930: 4b 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  K:          zNam
1940: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
1950: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
1960: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1970: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
1980: 54 41 42 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  TAB:        zNam
1990: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
19a0: 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20  UPT_VTAB";      
19b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19c0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
19d0: 52 45 43 4f 56 45 52 59 3a 20 20 20 7a 4e 61 6d  RECOVERY:   zNam
19e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
19f0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
1a00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a10: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
1a20: 43 41 4e 54 4c 4f 43 4b 3a 20 20 20 7a 4e 61 6d  CANTLOCK:   zNam
1a30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
1a40: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
1a50: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1a60: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  lt:             
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
1a80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e  e = "SQLITE_Unkn
1a90: 6f 77 6e 22 3b 20 20 20 20 20 20 20 20 20 20 20  own";           
1aa0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1ab0: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 64 65  urn zName;.}.#de
1ac0: 66 69 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65  fine t1ErrorName
1ad0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
1ae0: 72 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rName../*.** Con
1af0: 76 65 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f  vert an sqlite3_
1b00: 73 74 6d 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71  stmt* into an sq
1b10: 6c 69 74 65 33 2a 2e 20 20 54 68 69 73 20 64 65  lite3*.  This de
1b20: 70 65 6e 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  pends on the.** 
1b30: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73 71  fact that the sq
1b40: 6c 69 74 65 33 2a 20 69 73 20 74 68 65 20 66 69  lite3* is the fi
1b50: 72 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  rst field in the
1b60: 20 56 64 62 65 20 73 74 72 75 63 74 75 72 65 2e   Vdbe structure.
1b70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74 6d 74  .*/.#define Stmt
1b80: 54 6f 44 62 28 58 29 20 20 20 73 71 6c 69 74 65  ToDb(X)   sqlite
1b90: 33 5f 64 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a  3_db_handle(X)..
1ba0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65  /*.** Check a re
1bb0: 74 75 72 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61  turn value to ma
1bc0: 6b 65 20 73 75 72 65 20 69 74 20 61 67 72 65 65  ke sure it agree
1bd0: 73 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  s with the resul
1be0: 74 73 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ts.** from sqlit
1bf0: 65 33 5f 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69  e3_errcode..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  nt sqlite3TestEr
1c10: 72 43 6f 64 65 28 54 63 6c 5f 49 6e 74 65 72 70  rCode(Tcl_Interp
1c20: 20 2a 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65   *interp, sqlite
1c30: 33 20 2a 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a  3 *db, int rc){.
1c40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 68    if( sqlite3_th
1c50: 72 65 61 64 73 61 66 65 28 29 3d 3d 30 20 26 26  readsafe()==0 &&
1c60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55   rc!=SQLITE_MISU
1c70: 53 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  SE && rc!=SQLITE
1c80: 5f 4f 4b 0a 20 20 20 26 26 20 73 71 6c 69 74 65  _OK.   && sqlite
1c90: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72  3_errcode(db)!=r
1ca0: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  c ){.    char zB
1cb0: 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74  uf[200];.    int
1cc0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   r2 = sqlite3_er
1cd0: 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73  rcode(db);.    s
1ce0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72  printf(zBuf, "er
1cf0: 72 6f 72 20 63 6f 64 65 20 25 73 20 28 25 64 29  ror code %s (%d)
1d00: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
1d10: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
1d20: 25 73 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20  %s (%d)",.      
1d30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29   t1ErrorName(rc)
1d40: 2c 20 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d  , rc, t1ErrorNam
1d50: 65 28 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20  e(r2), r2);.    
1d60: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1d70: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
1d80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d90: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1da0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1dc0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
1dd0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1de0: 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63  lite3_stmt objec
1df0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1e00: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1e10: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e20: 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20  nterp, .  const 
1e30: 63 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20  char *zArg,  .  
1e40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
1e50: 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74  pStmt.){.  *ppSt
1e60: 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
1e70: 6d 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  mt*)sqlite3TestT
1e80: 65 78 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a  extToPtr(zArg);.
1e90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1eb0: 74 65 20 61 20 74 65 78 74 20 72 65 70 72 65 73  te a text repres
1ec0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f  entation of a po
1ed0: 69 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  inter that can b
1ee0: 65 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20  e understood.** 
1ef0: 62 79 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e  by the getDbPoin
1f00: 74 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69  ter and getVmPoi
1f10: 6e 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62  nter routines ab
1f20: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ove..**.** The p
1f30: 72 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f  roblem is, on so
1f40: 6d 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c  me machines (Sol
1f50: 61 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20  aris) if you do 
1f60: 61 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a  a printf with.**
1f70: 20 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74   "%p" you cannot
1f80: 20 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64   turn around and
1f90: 20 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68   do a scanf with
1fa0: 20 74 68 65 20 73 61 6d 65 20 22 25 70 22 20 61   the same "%p" a
1fb0: 6e 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70  nd.** get your p
1fc0: 6f 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f  ointer back.  Yo
1fd0: 75 20 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e  u have to prepen
1fe0: 64 20 61 20 22 30 78 22 20 62 65 66 6f 72 65 20  d a "0x" before 
1ff0: 69 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e  it will.** work.
2000: 20 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68    Or at least th
2010: 61 74 20 69 73 20 77 68 61 74 20 69 73 20 72 65  at is what is re
2020: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72  ported to me (dr
2030: 68 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a  h).  But this.**
2040: 20 62 65 68 61 76 69 6f 72 20 76 61 72 69 65 73   behavior varies
2050: 20 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f   from machine to
2060: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73   machine.  The s
2070: 6f 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72  olution used her
2080: 20 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74   is.** to test t
2090: 68 65 20 73 74 72 69 6e 67 20 72 69 67 68 74 20  he string right 
20a0: 61 66 74 65 72 20 69 74 20 69 73 20 67 65 6e 65  after it is gene
20b0: 72 61 74 65 64 20 74 6f 20 73 65 65 20 69 66 20  rated to see if 
20c0: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64  it can be.** und
20d0: 65 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66  erstood by scanf
20e0: 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72  , and if not, tr
20f0: 79 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20  y prepending an 
2100: 22 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a  "0x" to see if.*
2110: 2a 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49  * that helps.  I
2120: 66 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c  f nothing works,
2130: 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69   a fatal error i
2140: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
2150: 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d  int sqlite3TestM
2160: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63  akePointerStr(Tc
2170: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2180: 2c 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f  , char *zPtr, vo
2190: 69 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  id *p){.  sqlite
21a0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
21b0: 7a 50 74 72 2c 20 22 25 70 22 2c 20 70 29 3b 0a  zPtr, "%p", p);.
21c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
21d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61  .}../*.** The ca
21e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
21f0: 6f 72 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  or sqlite3_exec_
2200: 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61  printf()..*/.sta
2210: 74 69 63 20 69 6e 74 20 65 78 65 63 5f 70 72 69  tic int exec_pri
2220: 6e 74 66 5f 63 62 28 76 6f 69 64 20 2a 70 41 72  ntf_cb(void *pAr
2230: 67 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  g, int argc, cha
2240: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
2250: 2a 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53  *name){.  Tcl_DS
2260: 74 72 69 6e 67 20 2a 73 74 72 20 3d 20 28 54 63  tring *str = (Tc
2270: 6c 5f 44 53 74 72 69 6e 67 2a 29 70 41 72 67 3b  l_DString*)pArg;
2280: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
2290: 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
22a0: 74 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20  th(str)==0 ){.  
22b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
22c0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  c; i++){.      T
22d0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
22e0: 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d  Element(str, nam
22f0: 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a  e[i] ? name[i] :
2300: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a   "NULL");.    }.
2310: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2320: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
2330: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2340: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61  ndElement(str, a
2350: 72 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d  rgv[i] ? argv[i]
2360: 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a   : "NULL");.  }.
2370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2380: 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f 20 74 72 61  *.** The I/O tra
2390: 63 69 6e 67 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  cing callback..*
23a0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
23b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
23c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
23d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
23e0: 43 45 29 0a 73 74 61 74 69 63 20 46 49 4c 45 20  CE).static FILE 
23f0: 2a 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20  *iotrace_file = 
2400: 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  0;.static void i
2410: 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b  o_trace_callback
2420: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
2430: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2440: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2450: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2460: 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 69 6f  );.  vfprintf(io
2470: 74 72 61 63 65 5f 66 69 6c 65 2c 20 7a 46 6f 72  trace_file, zFor
2480: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
2490: 6e 64 28 61 70 29 3b 0a 20 20 66 66 6c 75 73 68  nd(ap);.  fflush
24a0: 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a  (iotrace_file);.
24b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24c0: 55 73 61 67 65 3a 20 20 69 6f 5f 74 72 61 63 65  Usage:  io_trace
24d0: 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20   FILENAME.**.** 
24e0: 54 75 72 6e 20 49 2f 4f 20 74 72 61 63 69 6e 67  Turn I/O tracing
24f0: 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 66 20   on or off.  If 
2500: 46 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f 74 20  FILENAME is not 
2510: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
2520: 0a 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  .** I/O tracing 
2530: 62 65 67 69 6e 73 20 67 6f 69 6e 67 20 69 6e 74  begins going int
2540: 6f 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66 20 46  o FILENAME. If F
2550: 49 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20 65 6d  ILENAME is an em
2560: 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 49  pty.** string, I
2570: 2f 4f 20 74 72 61 63 69 6e 67 20 69 73 20 74 75  /O tracing is tu
2580: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
2590: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6f 5f  tic int test_io_
25a0: 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 4e  trace(.  void *N
25b0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
25c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25d0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25e0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25f0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2600: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2620: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2630: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2640: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2650: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2660: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2670: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2680: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
2690: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
26a0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
26b0: 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ).  if( argc!=2 
26c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
26d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
26e0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
26f0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2700: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
2710: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
2720: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2730: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2740: 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65  if( iotrace_file
2750: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72   ){.    if( iotr
2760: 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74  ace_file!=stdout
2770: 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65   && iotrace_file
2780: 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20  !=stderr ){.    
2790: 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65    fclose(iotrace
27a0: 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _file);.    }.  
27b0: 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d    iotrace_file =
27c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
27d0: 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  oTrace = 0;.  }.
27e0: 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b 30 5d    if( argv[1][0]
27f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
2800: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 6f  mp(argv[1],"stdo
2810: 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ut")==0 ){.     
2820: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
2830: 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  stdout;.    }els
2840: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
2850: 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29 3d 3d  v[1],"stderr")==
2860: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
2870: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65 72 72  ce_file = stderr
2880: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2890: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
28a0: 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c  = fopen(argv[1],
28b0: 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "w");.    }.   
28c0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
28d0: 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62  = io_trace_callb
28e0: 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ack;.  }.#endif.
28f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2900: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
2910: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
2920: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
2930: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
2940: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
2950: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
2960: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
2970: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2980: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
2990: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
29a0: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
29b0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
29c0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
29d0: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
29e0: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
29f0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2a00: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
2a10: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
2a20: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
2a30: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2a40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a50: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a60: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2a70: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2a80: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2a90: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2aa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2ab0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2ac0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
2ad0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2ae0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2af0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2b00: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2b10: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
2b20: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
2b30: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
2b40: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
2b50: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
2b60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2b70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2b80: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2b90: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2ba0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
2bb0: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
2bc0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2bd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2be0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2bf0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
2c00: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
2c10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
2c20: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2c30: 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  str);.  zSql = s
2c40: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2c50: 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29  rgv[2], argv[3])
2c60: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2c70: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
2c80: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
2c90: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
2ca0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2cb0: 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  l);.  sprintf(zB
2cc0: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
2cd0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
2ce0: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
2cf0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2d00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63  ement(interp, rc
2d10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63  ==SQLITE_OK ? Tc
2d20: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2d30: 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20  str) : zErr);.  
2d40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
2d50: 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72  &str);.  if( zEr
2d60: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2d70: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
2d80: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
2d90: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
2da0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2db0: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
2dc0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2dd0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2de0: 78 65 63 5f 68 65 78 20 20 44 42 20 20 48 45 58  xec_hex  DB  HEX
2df0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
2e00: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  e sqlite3_exec()
2e10: 20 6f 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61   on a string tha
2e20: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79  t is obtained by
2e30: 20 74 72 61 6e 73 6c 61 74 69 6e 67 0a 2a 2a 20   translating.** 
2e40: 48 45 58 20 69 6e 74 6f 20 41 53 43 49 49 2e 20  HEX into ASCII. 
2e50: 20 4d 6f 73 74 20 63 68 61 72 61 63 74 65 72 73   Most characters
2e60: 20 61 72 65 20 74 72 61 6e 73 6c 61 74 65 64 20   are translated 
2e70: 61 73 20 69 73 2e 20 20 25 48 48 20 62 65 63 6f  as is.  %HH beco
2e80: 6d 65 73 0a 2a 2a 20 61 20 68 65 78 20 63 68 61  mes.** a hex cha
2e90: 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
2ea0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f  c int test_exec_
2eb0: 68 65 78 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  hex(.  void *Not
2ec0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2ed0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2ee0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2ef0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2f00: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2f10: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2f30: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2f40: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2f50: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
2f60: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2f70: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2f80: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
2f90: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
2fa0: 20 20 69 6e 74 20 72 63 2c 20 69 2c 20 6a 3b 0a    int rc, i, j;.
2fb0: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 3b 0a  ;.  char *zHex;.
2fd0: 20 20 63 68 61 72 20 7a 53 71 6c 5b 35 30 30 5d    char zSql[500]
2fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
2ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  ];.  if( argc!=3
3000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
3010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
3030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
3040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
3050: 22 20 44 42 20 48 45 58 22 2c 20 30 29 3b 0a 20  " DB HEX", 0);. 
3060: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3070: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
3080: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
3090: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
30a0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
30b0: 52 52 4f 52 3b 0a 20 20 7a 48 65 78 20 3d 20 61  RROR;.  zHex = a
30c0: 72 67 76 5b 32 5d 3b 0a 20 20 66 6f 72 28 69 3d  rgv[2];.  for(i=
30d0: 6a 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 53  j=0; i<sizeof(zS
30e0: 71 6c 29 20 26 26 20 7a 48 65 78 5b 6a 5d 3b 20  ql) && zHex[j]; 
30f0: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
3100: 66 28 20 7a 48 65 78 5b 6a 5d 3d 3d 27 25 27 20  f( zHex[j]=='%' 
3110: 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20 26 26 20  && zHex[j+2] && 
3120: 7a 48 65 78 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20  zHex[j+2] ){.   
3130: 20 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 28 74 65     zSql[i] = (te
3140: 73 74 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b  stHexToInt(zHex[
3150: 6a 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73 74  j+1])<<4) + test
3160: 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b  HexToInt(zHex[j+
3170: 32 5d 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20  2]);.      j += 
3180: 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
3190: 20 20 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48      zSql[i] = zH
31a0: 65 78 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ex[j];.    }.  }
31b0: 0a 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a  .  zSql[i] = 0;.
31c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
31d0: 74 28 26 73 74 72 29 3b 0a 20 20 72 63 20 3d 20  t(&str);.  rc = 
31e0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
31f0: 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e   zSql, exec_prin
3200: 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45  tf_cb, &str, &zE
3210: 72 72 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  rr);.  sprintf(z
3220: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
3230: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3240: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
3250: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
3260: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
3270: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
3280: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
3290: 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20  &str) : zErr);. 
32a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
32b0: 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45  (&str);.  if( zE
32c0: 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  rr ) sqlite3_fre
32d0: 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73  e(zErr);.  if( s
32e0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
32f0: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
3300: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3310: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
3320: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3330: 55 73 61 67 65 3a 20 20 64 62 5f 65 6e 74 65 72  Usage:  db_enter
3340: 20 44 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 64   DB.**         d
3350: 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a 2a 2a  b_leave DB.**.**
3360: 20 45 6e 74 65 72 20 6f 72 20 6c 65 61 76 65 20   Enter or leave 
3370: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 61 20 64  the mutex on a d
3380: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3390: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
33a0: 74 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76 6f  t db_enter(.  vo
33b0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
33c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
33d0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
33e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
33f0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3400: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3410: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3420: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3430: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3440: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3450: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3460: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3470: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
3480: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
3490: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
34a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
34b0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
34c0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
34d0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
34e0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
34f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
3510: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3520: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3530: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3540: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
3550: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
3560: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
3570: 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  L_OK;.}.static i
3580: 6e 74 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76  nt db_leave(.  v
3590: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
35a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
35b0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
35c0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
35d0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
35e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
35f0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
3600: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3610: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
3620: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3630: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
3640: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3650: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
3660: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
3670: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
3680: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3690: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
36a0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
36b0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
36c0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
36d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
36e0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
36f0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
3700: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
3710: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3720: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
3730: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
3740: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
3750: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3760: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
3770: 65 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a  exec  DB  SQL.**
3780: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3790: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
37a0: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
37b0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
37c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
37d0: 65 73 74 5f 65 78 65 63 28 0a 20 20 76 6f 69 64  est_exec(.  void
37e0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
37f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3800: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
3810: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
3820: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
3830: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
3840: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
3850: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
3860: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
3870: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
3880: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
3890: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
38a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
38b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
38c0: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
38d0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
38e0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
38f0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
3900: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66  r zBuf[30];.  if
3910: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
3920: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3930: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
3940: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
3950: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
3960: 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 53 51   .       " DB SQ
3970: 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  L", 0);.    retu
3980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3990: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
39a0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
39b0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
39c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
39d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
39e0: 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d  (&str);.  zSql =
39f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
3a00: 28 22 25 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b  ("%s", argv[2]);
3a10: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53  .  for(i=j=0; zS
3a20: 71 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28  ql[i];){.    if(
3a30: 20 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b   zSql[i]=='%' ){
3a40: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
3a50: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
3a60: 28 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20  (zSql[i+1])<<4) 
3a70: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
3a80: 53 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  Sql[i+2]);.     
3a90: 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c   i += 3;.    }el
3aa0: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  se{.      zSql[j
3ab0: 2b 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b  ++] = zSql[i++];
3ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71  .    }.  }.  zSq
3ad0: 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d  l[j] = 0;.  rc =
3ae0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
3af0: 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69  , zSql, exec_pri
3b00: 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a  ntf_cb, &str, &z
3b10: 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Err);.  sqlite3_
3b20: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70  free(zSql);.  sp
3b30: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
3b40: 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , rc);.  Tcl_App
3b50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3b60: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  p, zBuf);.  Tcl_
3b70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3b80: 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45  terp, rc==SQLITE
3b90: 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e  _OK ? Tcl_DStrin
3ba0: 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a  gValue(&str) : z
3bb0: 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Err);.  Tcl_DStr
3bc0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
3bd0: 20 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69   if( zErr ) sqli
3be0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
3bf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
3c00: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
3c10: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
3c20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3c30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3c40: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3c50: 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 20 20  qlite3_exec_nr  
3c60: 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e  DB  SQL.**.** In
3c70: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
3c80: 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63 65 20  _exec interface 
3c90: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
3ca0: 61 74 61 62 61 73 65 20 44 42 2e 20 20 44 69 73  atabase DB.  Dis
3cb0: 63 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65 73 75  card.** all resu
3cc0: 6c 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lts.*/.static in
3cd0: 74 20 74 65 73 74 5f 65 78 65 63 5f 6e 72 28 0a  t test_exec_nr(.
3ce0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3cf0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3d00: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3d10: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3d20: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3d30: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3d40: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3d50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3d60: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3d70: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3d90: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
3da0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
3db0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
3dc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
3dd0: 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d   0;.  if( argc!=
3de0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
3df0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3e00: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
3e10: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
3e20: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
3e30: 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
3e40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3e50: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
3e60: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
3e70: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
3e80: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
3e90: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
3ea0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
3eb0: 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 26 7a  rgv[2], 0, 0, &z
3ec0: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
3ed0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
3ee0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
3ef0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3f00: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
3f10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3f20: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3f30: 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50  intf_z_test  SEP
3f40: 41 52 41 54 4f 52 20 20 41 52 47 30 20 20 41 52  ARATOR  ARG0  AR
3f50: 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73  G1 ....**.** Tes
3f60: 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20  t the %z format 
3f70: 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74  of sqlite_mprint
3f80: 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70  f().  Use multip
3f90: 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c  le mprintf() cal
3fa0: 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74  ls to .** concat
3fb0: 65 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f 75  enate arg0 throu
3fc0: 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65  gh argn using se
3fd0: 70 61 72 61 74 6f 72 20 61 73 20 74 68 65 20 73  parator as the s
3fe0: 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74  eparator..** Ret
3ff0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
4000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4010: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
4020: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4030: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4040: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4050: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4060: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4070: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4080: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4090: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
40a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
40b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
40c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
40d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
40e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
40f0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
4100: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
4110: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
4120: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
4130: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
4140: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4150: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
4160: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
4170: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
4180: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4190: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
41a0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
41b0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
41c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
41d0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
41e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
41f0: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
4200: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
4210: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
4220: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
4230: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
4240: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
4250: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
4260: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
4270: 66 5f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_n(.  void *Not
4280: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
4290: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
42a0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
42b0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
42c0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
42d0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
42f0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4300: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4310: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4320: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4330: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4340: 63 68 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e  char *zStr;.  in
4350: 74 20 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20  t n = 0;.  zStr 
4360: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4370: 66 28 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31  f("%s%n", argv[1
4380: 5d 2c 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65  ], &n);.  sqlite
4390: 33 5f 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20  3_free(zStr);.  
43a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
43b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
43c0: 49 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65  IntObj(n));.  re
43d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
43e0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
43f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69  lite3_snprintf_i
4400: 6e 74 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20  nt  SIZE FORMAT 
4410: 20 49 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20   INT.**.** Test 
4420: 74 68 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73  the of sqlite3_s
4430: 6e 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e  nprintf() routin
4440: 65 2e 20 20 53 49 5a 45 20 69 73 20 74 68 65 20  e.  SIZE is the 
4450: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  size of the.** o
4460: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
4470: 62 79 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69  bytes.  The maxi
4480: 6d 75 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e  mum size is 100.
4490: 20 20 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a    FORMAT is the.
44a0: 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  ** format string
44b0: 2e 20 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67  .  INT is a sing
44c0: 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  le integer argum
44d0: 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54  ent.  The FORMAT
44e0: 0a 2a 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20  .** string must 
44f0: 72 65 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20  require no more 
4500: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e  than this one in
4510: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20  teger argument. 
4520: 20 49 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20   If.** You pass 
4530: 69 6e 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69  in a format stri
4540: 6e 67 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ng that requires
4550: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61   more than one a
4560: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20  rgument,.** bad 
4570: 74 68 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70  things will happ
4580: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
4590: 74 20 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f  t test_snprintf_
45a0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
45b0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
45c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
45d0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
45e0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
45f0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
4600: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
4610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4620: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4630: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4640: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4650: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4660: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4670: 63 68 61 72 20 7a 53 74 72 5b 31 30 30 5d 3b 0a  char zStr[100];.
4680: 20 20 69 6e 74 20 6e 20 3d 20 61 74 6f 69 28 61    int n = atoi(a
4690: 72 67 76 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[1]);.  const
46a0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d   char *zFormat =
46b0: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74 20   argv[2];.  int 
46c0: 61 31 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 33  a1 = atoi(argv[3
46d0: 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 73 69 7a 65  ]);.  if( n>size
46e0: 6f 66 28 7a 53 74 72 29 20 29 20 6e 20 3d 20 73  of(zStr) ) n = s
46f0: 69 7a 65 6f 66 28 7a 53 74 72 29 3b 0a 20 20 73  izeof(zStr);.  s
4700: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4710: 73 69 7a 65 6f 66 28 7a 53 74 72 29 2c 20 7a 53  sizeof(zStr), zS
4720: 74 72 2c 20 22 61 62 63 64 65 66 67 68 69 6a 6b  tr, "abcdefghijk
4730: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
4740: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
4750: 72 69 6e 74 66 28 6e 2c 20 7a 53 74 72 2c 20 7a  rintf(n, zStr, z
4760: 46 6f 72 6d 61 74 2c 20 61 31 29 3b 0a 20 20 54  Format, a1);.  T
4770: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4780: 69 6e 74 65 72 70 2c 20 7a 53 74 72 2c 20 30 29  interp, zStr, 0)
4790: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
47a0: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
47b0: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
47c0: 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BLE../*.** Usage
47d0: 3a 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74  :  sqlite3_get_t
47e0: 61 62 6c 65 5f 70 72 69 6e 74 66 20 20 44 42 20  able_printf  DB 
47f0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 20   FORMAT  STRING 
4800: 20 3f 2d 2d 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a   ?--no-counts?.*
4810: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
4820: 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c  sqlite3_get_tabl
4830: 65 5f 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72  e_printf() inter
4840: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
4850: 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
4860: 44 42 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20  DB.  The SQL is 
4870: 74 68 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41  the string FORMA
4880: 54 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73  T.  The format s
4890: 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e  tring should con
48a0: 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f  tain.** one %s o
48b0: 72 20 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73  r %q.  STRING is
48c0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72   the value inser
48d0: 74 65 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25  ted into %s or %
48e0: 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  q..*/.static int
48f0: 20 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f   test_get_table_
4900: 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a  printf(.  void *
4910: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4920: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4930: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4940: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
4950: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
4960: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
4970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4990: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
49a0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
49b0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
49c0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
49d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
49e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
49f0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
4a00: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
4a10: 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b   int nRow, nCol;
4a20: 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75 6c  .  char **aResul
4a30: 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  t;.  int i;.  ch
4a40: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 63  ar zBuf[30];.  c
4a50: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
4a60: 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b 0a   resCount = -1;.
4a70: 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b    if( argc==5 ){
4a80: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
4a90: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
4aa0: 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29 20  [4], &resCount) 
4ab0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
4ac0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  OR;.  }.  if( ar
4ad0: 67 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d 35  gc!=4 && argc!=5
4ae0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4af0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4b00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4b10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4b20: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
4b30: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
4b40: 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29 3b  NG ?COUNT?", 0);
4b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4b60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4b70: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
4b80: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
4b90: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
4ba0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53  _ERROR;.  Tcl_DS
4bb0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
4bc0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
4bd0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32  3_mprintf(argv[2
4be0: 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66  ],argv[3]);.  if
4bf0: 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20  ( argc==5 ){.   
4c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65   rc = sqlite3_ge
4c10: 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c  t_table(db, zSql
4c20: 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20 30  , &aResult, 0, 0
4c30: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c 73  , &zErr);.  }els
4c40: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
4c50: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
4c60: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
4c70: 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c 20  , &nRow, &nCol, 
4c80: 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73 43  &zErr);.    resC
4c90: 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29 2a  ount = (nRow+1)*
4ca0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nCol;.  }.  sqli
4cb0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
4cc0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
4cd0: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
4ce0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4cf0: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4d00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4d10: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67  K ){.    if( arg
4d20: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 70  c==4 ){.      sp
4d30: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
4d40: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
4d50: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4d60: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4d70: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
4d80: 75 66 2c 20 22 25 64 22 2c 20 6e 43 6f 6c 29 3b  uf, "%d", nCol);
4d90: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
4da0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4db0: 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20   zBuf);.    }.  
4dc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 65 73    for(i=0; i<res
4dd0: 43 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Count; i++){.   
4de0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
4df0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 61 52 65  ment(interp, aRe
4e00: 73 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73 75 6c  sult[i] ? aResul
4e10: 74 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  t[i] : "NULL");.
4e20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4e30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
4e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  ment(interp, zEr
4e50: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
4e60: 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 52 65  3_free_table(aRe
4e70: 73 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a 45 72  sult);.  if( zEr
4e80: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
4e90: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
4ea0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
4eb0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
4ec0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4ed0: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
4ee0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  L_OK;.}..#endif 
4ef0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  /* SQLITE_OMIT_G
4f00: 45 54 5f 54 41 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a  ET_TABLE */.../*
4f10: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
4f20: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
4f30: 72 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rowid DB.**.** R
4f40: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67  eturns the integ
4f50: 65 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  er ROWID of the 
4f60: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
4f70: 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rt..*/.static in
4f80: 74 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69  t test_last_rowi
4f90: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
4fa0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4fb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4fc0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4fd0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4fe0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4ff0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
5000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5010: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5020: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
5030: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
5040: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
5050: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
5060: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
5070: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69  r zBuf[30];..  i
5080: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
5090: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
50a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
50b0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
50c0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
50d0: 2c 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20  , " DB\"", 0);. 
50e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
50f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
5100: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
5110: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
5120: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
5130: 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28  RROR;.  sprintf(
5140: 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71  zBuf, "%lld", sq
5150: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
5160: 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 20 20  t_rowid(db));.  
5170: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5180: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
5190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
51a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
51b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
51c0: 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a  key DB KEY.**.**
51d0: 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 6b   Set the codec k
51e0: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
51f0: 74 20 74 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f  t test_key(.  vo
5200: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
5210: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5220: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
5230: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
5240: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
5250: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
5260: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
5270: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5280: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
5290: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
52a0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
52b0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
52c0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
52d0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
52e0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
52f0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
5300: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
5310: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5320: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
5330: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
5340: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
5350: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
5360: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5370: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
5380: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
5390: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
53a0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
53b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
53c0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
53d0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
53e0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
53f0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c  _HAS_CODEC.  sql
5400: 69 74 65 33 5f 6b 65 79 28 64 62 2c 20 7a 4b 65  ite3_key(db, zKe
5410: 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66  y, nKey);.#endif
5420: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
5430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
5440: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  :  sqlite3_rekey
5450: 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68   DB KEY.**.** Ch
5460: 61 6e 67 65 20 74 68 65 20 63 6f 64 65 63 20 6b  ange the codec k
5470: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
5480: 74 20 74 65 73 74 5f 72 65 6b 65 79 28 0a 20 20  t test_rekey(.  
5490: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
54a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
54b0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
54c0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
54d0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
54e0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
54f0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
5500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5510: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5520: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5530: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
5540: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5550: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
5560: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
5570: 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20  ar *zKey;.  int 
5580: 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63  nKey;.  if( argc
5590: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
55a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
55b0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
55c0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
55d0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
55e0: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
55f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5600: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5610: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
5620: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
5630: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
5640: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b   TCL_ERROR;.  zK
5650: 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ey = argv[2];.  
5660: 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b  nKey = strlen(zK
5670: 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ey);.#ifdef SQLI
5680: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73  TE_HAS_CODEC.  s
5690: 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62 2c  qlite3_rekey(db,
56a0: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65   zKey, nKey);.#e
56b0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
56c0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
56d0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63  sage:  sqlite3_c
56e0: 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c  lose DB.**.** Cl
56f0: 6f 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  oses the databas
5700: 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
5710: 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61  te3_open..*/.sta
5720: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74  tic int sqlite_t
5730: 65 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69  est_close(.  voi
5740: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
5750: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5760: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
5770: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
5780: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
5790: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
57a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
57b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
57c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
57d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
57e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
57f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
5800: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
5810: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
5820: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
5830: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5840: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
5850: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
5860: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
5870: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
5880: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
5890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
58a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
58b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
58c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
58d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
58e0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
58f0: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54  3_close(db);.  T
5900: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
5910: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
5920: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
5930: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
5940: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
5950: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5960: 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f 61  ion of the x_coa
5970: 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f 6e  lesce() function
5980: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
5990: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6e  first argument n
59a0: 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
59b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
59c0: 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28 0a   t1_ifnullFunc(.
59d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
59e0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
59f0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5a00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5a10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5a20: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
5a30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  +){.    if( SQLI
5a40: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
5a50: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
5a60: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  [i]) ){.      in
5a70: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t n = sqlite3_va
5a80: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69  lue_bytes(argv[i
5a90: 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
5aa0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5ab0: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71  ntext, (char*)sq
5ac0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5ad0: 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20 20  (argv[i]),.     
5ae0: 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f 54       n, SQLITE_T
5af0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
5b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5b10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  }.}../*.** These
5b20: 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74 69   are test functi
5b30: 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20 69  ons.    hex8() i
5b40: 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72  nterprets its ar
5b50: 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54 46  gument as.** UTF
5b60: 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  8 and returns a 
5b70: 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20 68  hex encoding.  h
5b80: 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70 72  ex16le() interpr
5b90: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
5ba0: 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20 61  .** as UTF16le a
5bb0: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65 78  nd returns a hex
5bc0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74   encoding..*/.st
5bd0: 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46 75  atic void hex8Fu
5be0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
5bf0: 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c  xt *p, int argc,
5c00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5c10: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
5c20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
5c30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
5c40: 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 7a  r zBuf[200];.  z
5c50: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5c60: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
5c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
5c80: 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32 20  eof(zBuf)/2 - 2 
5c90: 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  && z[i]; i++){. 
5ca0: 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66     sprintf(&zBuf
5cb0: 5b 69 2a 32 5d 2c 20 22 25 30 32 78 22 2c 20 7a  [i*2], "%02x", z
5cc0: 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20  [i]&0xff);.  }. 
5cd0: 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a   zBuf[i*2] = 0;.
5ce0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5cf0: 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29  _text(p, (char*)
5d00: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
5d10: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23  _TRANSIENT);.}.#
5d20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5d30: 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
5d40: 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28 73  void hex16Func(s
5d50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5d60: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5d70: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5d80: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5d90: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a  gned short int *
5da0: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5db0: 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20  ar zBuf[400];.  
5dc0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5dd0: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
5de0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5df0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d  sizeof(zBuf)/4 -
5e00: 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29   4 && z[i]; i++)
5e10: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  {.    sprintf(&z
5e20: 42 75 66 5b 69 2a 34 5d 2c 20 22 25 30 34 78 22  Buf[i*4], "%04x"
5e30: 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20  , z[i]&0xff);.  
5e40: 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d 20  }.  zBuf[i*4] = 
5e50: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  0;.  sqlite3_res
5e60: 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61  ult_text(p, (cha
5e70: 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c  r*)zBuf, -1, SQL
5e80: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5e90: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5ea0: 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f  A structure into
5eb0: 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75   which to accumu
5ec0: 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73 74  late text..*/.st
5ed0: 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69 6e  ruct dstr {.  in
5ee0: 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70  t nAlloc;  /* Sp
5ef0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  ace allocated */
5f00: 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20  .  int nUsed;   
5f10: 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a 2f  /* Space used */
5f20: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
5f30: 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f 0a  /* The space */.
5f40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  };../*.** Append
5f50: 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72 0a   text to a dstr.
5f60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
5f70: 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63 74  strAppend(struct
5f80: 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20   dstr *p, const 
5f90: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69 76  char *z, int div
5fa0: 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  ider){.  int n =
5fb0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66   strlen(z);.  if
5fc0: 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b  ( p->nUsed + n +
5fd0: 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29   2 > p->nAlloc )
5fe0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77  {.    char *zNew
5ff0: 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20  ;.    p->nAlloc 
6000: 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  = p->nAlloc*2 + 
6010: 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65  n + 200;.    zNe
6020: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
6030: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
6040: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  loc);.    if( zN
6050: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
6060: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
6070: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
6080: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
6090: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
60a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20  .    }.    p->z 
60b0: 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66  = zNew;.  }.  if
60c0: 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e  ( divider && p->
60d0: 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70  nUsed>0 ){.    p
60e0: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  ->z[p->nUsed++] 
60f0: 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20  = divider;.  }. 
6100: 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d   memcpy(&p->z[p-
6110: 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29  >nUsed], z, n+1)
6120: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20  ;.  p->nUsed += 
6130: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  n;.}../*.** Invo
6140: 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ked for each cal
6150: 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74  lback from sqlit
6160: 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74  e3ExecFunc.*/.st
6170: 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e  atic int execFun
6180: 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  cCallback(void *
6190: 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c  pData, int argc,
61a0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
61b0: 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ar **NotUsed){. 
61c0: 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20   struct dstr *p 
61d0: 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29  = (struct dstr*)
61e0: 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a  pData;.  int i;.
61f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
6200: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
6210: 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20   argv[i]==0 ){. 
6220: 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28       dstrAppend(
6230: 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b  p, "NULL", ' ');
6240: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6250: 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20    dstrAppend(p, 
6260: 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20  argv[i], ' ');. 
6270: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6280: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  n 0;.}../*.** Im
6290: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
62a0: 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65  the x_sqlite_exe
62b0: 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  c() function.  T
62c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  his function tak
62d0: 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61  es.** a single a
62e0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65  rgument and atte
62f0: 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20  mpts to execute 
6300: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73  that argument as
6310: 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68   SQL code..** Th
6320: 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e  is is illegal an
6330: 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65  d should set the
6340: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66   SQLITE_MISUSE f
6350: 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lag on the datab
6360: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ase..**.** 2004-
6370: 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65  Jan-07:  We have
6380: 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f   changed this to
6390: 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74   make it legal t
63a0: 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  o call sqlite3_e
63b0: 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69  xec().** from wi
63c0: 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20  thin a function 
63d0: 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54  call.  .** .** T
63e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75  his routine simu
63f0: 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74  lates the effect
6400: 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74   of having two t
6410: 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74  hreads attempt t
6420: 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d  o.** use the sam
6430: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
6440: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a  e same time..*/.
6450: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
6460: 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73  te3ExecFunc(.  s
6470: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6480: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
6490: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
64a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
64b0: 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20  {.  struct dstr 
64c0: 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20  x;.  memset(&x, 
64d0: 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  0, sizeof(x));. 
64e0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
64f0: 78 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71  xec((sqlite3*)sq
6500: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
6510: 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20  context),.      
6520: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
6530: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6540: 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75  ]),.      execFu
6550: 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20  ncCallback, &x, 
6560: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  0);.  sqlite3_re
6570: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
6580: 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c  t, x.z, x.nUsed,
6590: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
65a0: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  T);.  sqlite3_fr
65b0: 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(x.z);.}../*.*
65c0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
65d0: 20 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28   of tkt2213func(
65e0: 29 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63  ), a scalar func
65f0: 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20  tion that takes 
6600: 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61  exactly.** one a
6610: 72 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20  rgument. It has 
6620: 74 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20  two interesting 
6630: 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20  features:.**.** 
6640: 2a 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74  * It calls sqlit
6650: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20  e3_value_text() 
6660: 33 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61  3 times on the a
6670: 72 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f  rgument sqlite3_
6680: 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20  value*..**   If 
6690: 74 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65  the three pointe
66a0: 72 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20  rs returned are 
66b0: 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20  not the same an 
66c0: 53 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69  SQL error is rai
66d0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68  sed..**.** * Oth
66e0: 65 72 77 69 73 65 20 69 74 20 72 65 74 75 72 6e  erwise it return
66f0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
6700: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
6710: 69 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20 20  ion of its .**  
6720: 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63   argument in suc
6730: 68 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56  h a way as the V
6740: 44 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69  DBE representati
6750: 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c  on is a Mem* cel
6760: 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65  l .**   with the
6770: 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63   MEM_Term flag c
6780: 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63  lear. .**.** Tic
6790: 6b 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68  ket #2213 can th
67a0: 65 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65  erefore be teste
67b0: 64 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20  d by evaluating 
67c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
67d0: 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a   SQL expression:
67e0: 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33  .**.**   tkt2213
67f0: 66 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63  func(tkt2213func
6800: 28 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a  ('a string'));.*
6810: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b  /.static void tk
6820: 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20  t2213Function(. 
6830: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6840: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
6850: 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69  t argc,  .  sqli
6860: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
6870: 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b  .){.  int nText;
6880: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
6890: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a   const *zText1;.
68a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
68b0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20  const *zText2;. 
68c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
68d0: 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20  onst *zText3;.. 
68e0: 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33   nText = sqlite3
68f0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
6900: 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20  v[0]);.  zText1 
6910: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6920: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
6930: 20 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65   zText2 = sqlite
6940: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6950: 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20  v[0]);.  zText3 
6960: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6970: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a  text(argv[0]);..
6980: 20 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54    if( zText1!=zT
6990: 65 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d  ext2 || zText2!=
69a0: 7a 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71  zText3 ){.    sq
69b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
69c0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74  or(context, "tkt
69d0: 32 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65  2213 is not fixe
69e0: 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  d", -1);.  }else
69f0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70  {.    char *zCop
6a00: 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  y = (char *)sqli
6a10: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74  te3_malloc(nText
6a20: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43  );.    memcpy(zC
6a30: 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65  opy, zText1, nTe
6a40: 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
6a50: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6a60: 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65  text, zCopy, nTe
6a70: 78 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  xt, sqlite3_free
6a80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6a90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  The following SQ
6aa0: 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  L function takes
6ab0: 20 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54   4 arguments.  T
6ac0: 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74  he 2nd and.** 4t
6ad0: 68 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  h argument must 
6ae0: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  be one of these 
6af0: 73 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27  strings:  'text'
6b00: 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f  , 'text16',.** o
6b10: 72 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70  r 'blob' corresp
6b20: 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75  onding to API fu
6b30: 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20  nctions.**.**   
6b40: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
6b50: 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20  _text().**      
6b60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6b70: 78 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73  xt16().**      s
6b80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
6b90: 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  b().**.** The th
6ba0: 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
6bb0: 61 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72  a string, either
6bc0: 20 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74   'bytes' or 'byt
6bd0: 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c  es16' or 'noop',
6be0: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
6bf0: 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a  g to APIs:.**.**
6c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6c10: 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20  lue_bytes().**  
6c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6c30: 65 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20  e_bytes16().**  
6c40: 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54      noop.**.** T
6c50: 68 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74  he APIs designat
6c60: 65 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68  ed by the 2nd th
6c70: 72 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65  rough 4th argume
6c80: 6e 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a  nts are applied.
6c90: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
6ca0: 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65  argument in orde
6cb0: 72 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74  r.  If the point
6cc0: 65 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ers returned by 
6cd0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e  the.** second an
6ce0: 64 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66  d fourth are dif
6cf0: 66 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75  ferent, this rou
6d00: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20  tine returns 1. 
6d10: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
6d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6d30: 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rns 0..**.** Thi
6d40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
6d50: 65 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65  ed to test to se
6d60: 65 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20  e when returned 
6d70: 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a  pointers from.**
6d80: 20 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74   the _text(), _t
6d90: 65 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f  ext16() and _blo
6da0: 62 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20  b() APIs become 
6db0: 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
6dc0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43  static void ptrC
6dd0: 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  hngFunction(.  s
6de0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6df0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
6e00: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
6e10: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6e20: 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
6e30: 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74  p1, *p2;.  const
6e40: 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69   char *zCmd;.  i
6e50: 66 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74  f( argc!=4 ) ret
6e60: 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63  urn;.  zCmd = (c
6e70: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
6e80: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6e90: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43  gv[1]);.  if( zC
6ea0: 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  md==0 ) return;.
6eb0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
6ec0: 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a  d,"text")==0 ){.
6ed0: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
6ee0: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
6ef0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
6f00: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
6f10: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d  E_OMIT_UTF16.  }
6f20: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
6f30: 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d  zCmd, "text16")=
6f40: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
6f50: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
6f60: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
6f70: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69  (argv[0]);.#endi
6f80: 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  f.  }else if( st
6f90: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62  rcmp(zCmd, "blob
6fa0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20  ")==0 ){.    p1 
6fb0: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
6fc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
6fd0: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65  b(argv[0]);.  }e
6fe0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  lse{.    return;
6ff0: 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63  .  }.  zCmd = (c
7000: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
7010: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7020: 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43  gv[2]);.  if( zC
7030: 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  md==0 ) return;.
7040: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
7050: 64 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b  d,"bytes")==0 ){
7060: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
7070: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
7080: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7090: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d  E_OMIT_UTF16.  }
70a0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
70b0: 7a 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29  zCmd, "bytes16")
70c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
70d0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36  e3_value_bytes16
70e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69  (argv[0]);.#endi
70f0: 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  f.  }else if( st
7100: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70  rcmp(zCmd, "noop
7110: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ")==0 ){.    /* 
7120: 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  do nothing */.  
7130: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
7140: 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20  n;.  }.  zCmd = 
7150: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
7160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7170: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
7180: 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  zCmd==0 ) return
7190: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
71a0: 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29  Cmd,"text")==0 )
71b0: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
71c0: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
71d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
71e0: 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0]);.#ifndef SQL
71f0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
7200: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
7210: 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22  p(zCmd, "text16"
7220: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
7230: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
7240: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7250: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e  16(argv[0]);.#en
7260: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
7270: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c  strcmp(zCmd, "bl
7280: 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ob")==0 ){.    p
7290: 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  2 = (const void*
72a0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
72b0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  lob(argv[0]);.  
72c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
72d0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
72e0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
72f0: 65 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a  ext, p1!=p2);.}.
7300: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
7310: 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61  sqlite_test_crea
7320: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
7330: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
7340: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7350: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
7360: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
7370: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
7380: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
7390: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
73a0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
73b0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
73c0: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
73d0: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
73e0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
73f0: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
7400: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
7410: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
7420: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
7430: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
7440: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
7450: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
7460: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
7470: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
7480: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
7490: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
74a0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
74b0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
74c0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
74d0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
74e0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
74f0: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
7500: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
7510: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
7520: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
7530: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
7540: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
7550: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
7560: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
7570: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7580: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
7590: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
75a0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
75b0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
75c0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
75d0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
75e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
75f0: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
7600: 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  on(.  void *NotU
7610: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
7620: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
7630: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
7640: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
7650: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
7660: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
7670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7680: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
7690: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
76a0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
76b0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
76c0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
76d0: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
76e0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67   *db;..  if( arg
76f0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
7700: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7710: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
7720: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
7730: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
7740: 20 20 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a     " DB\"", 0);.
7750: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7760: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
7770: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
7780: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
7790: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
77a0: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
77b0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
77c0: 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61  ction(db, "x_coa
77d0: 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49  lesce", -1, SQLI
77e0: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
77f0: 20 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e      t1_ifnullFun
7800: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
7810: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7820: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7830: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7840: 6e 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c  n(db, "hex8", 1,
7850: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
7860: 0a 20 20 20 20 20 20 20 20 20 20 68 65 78 38 46  .          hex8F
7870: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
7880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7890: 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28 20  MIT_UTF16.  if( 
78a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
78b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
78c0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
78d0: 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20 31  n(db, "hex16", 1
78e0: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
78f0: 20 0a 20 20 20 20 20 20 20 20 20 20 68 65 78 31   .          hex1
7900: 36 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  6Func, 0, 0);.  
7910: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
7920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7940: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7950: 28 64 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e  (db, "tkt2213fun
7960: 63 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e  c", 1, SQLITE_AN
7970: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
7980: 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e   tkt2213Function
7990: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
79a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
79b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
79c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
79d0: 74 69 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65  tion(db, "pointe
79e0: 72 5f 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51  r_change", 4, SQ
79f0: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20  LITE_ANY, 0, .  
7a00: 20 20 20 20 20 20 20 20 70 74 72 43 68 6e 67 46          ptrChngF
7a10: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  unction, 0, 0);.
7a20: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
7a30: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
7a40: 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69   /* Use the sqli
7a50: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7a60: 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72 65  ion16() API here
7a70: 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75 6e  . Mainly for fun
7a80: 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a 2a  , but also .  **
7a90: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
7aa0: 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68 65  ot tested anywhe
7ab0: 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69 66  re else. */.  if
7ac0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7ad0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  ){.    const voi
7ae0: 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 73  d *zUtf16;.    s
7af0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
7b00: 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  al;.    sqlite3_
7b10: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7b20: 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c  mutex);.    pVal
7b30: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
7b40: 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
7b50: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
7b60: 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c 69  Val, -1, "x_sqli
7b70: 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54 45  te_exec", SQLITE
7b80: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
7b90: 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31  ATIC);.    zUtf1
7ba0: 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  6 = sqlite3Value
7bb0: 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
7bc0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
7bd0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
7be0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
7bf0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
7c00: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
7c10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7c20: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7c30: 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c  on16(db, zUtf16,
7c40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7c50: 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31    1, SQLITE_UTF1
7c60: 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78  6, db, sqlite3Ex
7c70: 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  ecFunc, 0, 0);. 
7c80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7c90: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
7ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
7cb0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
7cc0: 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
7cd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
7ce0: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
7cf0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
7d00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7d10: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
7d20: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
7d30: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
7d40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
7d50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  OK;.}../*.** Rou
7d60: 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65  tines to impleme
7d70: 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28 29  nt the x_count()
7d80: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7d90: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75  ion..**.** x_cou
7da0: 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65 20  nt() counts the 
7db0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75  number of non-nu
7dc0: 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 42  ll arguments.  B
7dd0: 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  ut there are.** 
7de0: 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72 20  some twists for 
7df0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
7e00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61  ..**.** If the a
7e10: 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f 75  rgument to x_cou
7e20: 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e 20  nt() is 40 then 
7e30: 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73  a UTF-8 error is
7e40: 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20   reported.** on 
7e50: 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
7e60: 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28 34  n.  If x_count(4
7e70: 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  1) is seen, then
7e80: 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72 0a   a UTF-16 error.
7e90: 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f  ** is reported o
7ea0: 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74  n the step funct
7eb0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f 74  ion.  If the tot
7ec0: 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c 20  al count is 42, 
7ed0: 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38 20  then.** a UTF-8 
7ee0: 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65  error is reporte
7ef0: 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69 7a  d on the finaliz
7f00: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74  e function..*/.t
7f10: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74 31  ypedef struct t1
7f20: 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e 74  CountCtx t1Count
7f30: 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43 6f  Ctx;.struct t1Co
7f40: 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e  untCtx {.  int n
7f50: 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.};.static void
7f60: 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20 20   t1CountStep(.  
7f70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7f80: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7f90: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7fa0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7fb0: 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b    t1CountCtx *p;
7fc0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
7fd0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7fe0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7ff0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72  (*p));.  if( (ar
8000: 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  gc==0 || SQLITE_
8010: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
8020: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8030: 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20  ) ) && p ){.    
8040: 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  p->n++;.  }.  if
8050: 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20  ( argc>0 ){.    
8060: 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  int v = sqlite3_
8070: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
8080: 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 34  ]);.    if( v==4
8090: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
80a0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
80b0: 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65 20  context, "value 
80c0: 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f 20  of 40 handed to 
80d0: 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a 23  x_count", -1);.#
80e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
80f0: 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65 6c  IT_UTF16.    }el
8100: 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b 0a  se if( v==41 ){.
8110: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
8120: 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d 20   zUtf16ErrMsg[] 
8130: 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c 20  = { 0, 0x61, 0, 
8140: 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20 30  0x62, 0, 0x63, 0
8150: 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20 73  , 0, 0};.      s
8160: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8170: 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20 26  ror16(context, &
8180: 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d 53  zUtf16ErrMsg[1-S
8190: 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 5d  QLITE_BIGENDIAN]
81a0: 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
81b0: 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61    }.  }.}   .sta
81c0: 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74  tic void t1Count
81d0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
81e0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
81f0: 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74 78  t){.  t1CountCtx
8200: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
8210: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
8220: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
8230: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
8240: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
8250: 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20 20  >n==42 ){.      
8260: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8270: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 78  rror(context, "x
8280: 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74 6f  _count totals to
8290: 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d   42", -1);.    }
82a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
82b0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
82c0: 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e  ontext, p ? p->n
82d0: 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   : 0);.    }.  }
82e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
82f0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
8300: 45 44 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  ED.static void l
8310: 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 28 0a  egacyCountStep(.
8320: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
8330: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8340: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8350: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8360: 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  {.  /* no-op */.
8370: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  }..static void l
8380: 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69  egacyCountFinali
8390: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
83a0: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
83b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
83c0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  nt(context, sqli
83d0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
83e0: 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a 7d  unt(context));.}
83f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
8400: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63  sage:  sqlite3_c
8410: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20  reate_aggregate 
8420: 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  DB.**.** Call th
8430: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
8440: 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e  _function API on
8450: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
8460: 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ase in order.** 
8470: 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63  to create a func
8480: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f  tion named "x_co
8490: 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e 63  unt".  This func
84a0: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 0a  tion is similar.
84b0: 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c 74 2d  ** to the built-
84c0: 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e 63 74  in count() funct
84d0: 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65 77 20  ion, with a few 
84e0: 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73 0a 2a  special quirks.*
84f0: 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68  * for testing th
8500: 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  e sqlite3_result
8510: 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e 0a 2a  _error() APIs..*
8520: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
8530: 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72  l motivation for
8540: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
8550: 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  s to be able to 
8560: 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  call the.** sqli
8570: 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65  te3_create_aggre
8580: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68  gate function wh
8590: 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20 69  ile a query is i
85a0: 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72  n progress in or
85b0: 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74  der.** to test t
85c0: 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  he SQLITE_MISUSE
85d0: 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63   detection logic
85e0: 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e 74 65  .  See misuse.te
85f0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
8600: 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74 65 72  outine was later
8610: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 65 73   extended to tes
8620: 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 71 6c  t the use of sql
8630: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8640: 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61 67  r().** within ag
8650: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
8660: 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20  s..**.** Later: 
8670: 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20 65  It is now also e
8680: 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67 69 73  xtended to regis
8690: 74 65 72 20 74 68 65 20 61 67 67 72 65 67 61 74  ter the aggregat
86a0: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c  e function.** "l
86b0: 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22 20 77  egacy_count()" w
86c0: 69 74 68 20 74 68 65 20 73 75 70 70 6c 69 65 64  ith the supplied
86d0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
86e0: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a  . This is used.*
86f0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64 65  * to test the de
8700: 70 72 65 63 61 74 65 64 20 73 71 6c 69 74 65 33  precated sqlite3
8710: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74  _aggregate_count
8720: 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69  () API..*/.stati
8730: 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74  c int test_creat
8740: 65 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76  e_aggregate(.  v
8750: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
8760: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8770: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
8780: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
8790: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
87a0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
87b0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
87c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
87d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
87e0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
87f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
8800: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
8810: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
8820: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
8830: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
8840: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8850: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8860: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8870: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
8880: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
8890: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
88a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
88b0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
88c0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
88d0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
88e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
88f0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
8900: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8910: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
8920: 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 0, SQLITE_UTF
8930: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74  8, 0, 0,.      t
8940: 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75  1CountStep,t1Cou
8950: 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69  ntFinalize);.  i
8960: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8970: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8980: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8990: 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e  tion(db, "x_coun
89a0: 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  t", 1, SQLITE_UT
89b0: 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  F8, 0, 0,.      
89c0: 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31    t1CountStep,t1
89d0: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a  CountFinalize);.
89e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
89f0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
8a00: 45 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ED.  if( rc==SQL
8a10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
8a20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8a30: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
8a40: 6c 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30  legacy_count", 0
8a50: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
8a60: 20 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61   0,.        lega
8a70: 63 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67  cyCountStep, leg
8a80: 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  acyCountFinalize
8a90: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
8aa0: 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
8ab0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
8ac0: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
8ad0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8ae0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
8af0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
8b00: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
8b10: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
8b20: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
8b30: 55 73 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54  Usage:  printf T
8b40: 45 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f  EXT.**.** Send o
8b50: 75 74 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e  utput to printf.
8b60: 20 20 55 73 65 20 74 68 69 73 20 72 61 74 68 65    Use this rathe
8b70: 72 20 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d  r than puts to m
8b80: 65 72 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a  erge the output.
8b90: 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ** in the correc
8ba0: 74 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  t sequence with 
8bb0: 64 65 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66  debugging printf
8bc0: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
8bd0: 43 20 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20  C code..** Puts 
8be0: 75 73 65 73 20 61 20 73 65 70 61 72 61 74 65 20  uses a separate 
8bf0: 62 75 66 66 65 72 20 61 6e 64 20 64 65 62 75 67  buffer and debug
8c00: 67 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  ging statements 
8c10: 77 69 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a  will be out of.*
8c20: 2a 20 73 65 71 75 65 6e 63 65 20 69 66 20 69 74  * sequence if it
8c30: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61   is used..*/.sta
8c40: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 69  tic int test_pri
8c50: 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ntf(.  void *Not
8c60: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8c70: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8c80: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8c90: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8ca0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8cb0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8cd0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8ce0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
8cf0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
8d00: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8d10: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8d20: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
8d30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8d40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8d50: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8d60: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8d70: 5d 2c 0a 20 20 20 20 20 20 20 22 20 54 45 58 54  ],.       " TEXT
8d80: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
8d90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8da0: 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 25 73 5c   }.  printf("%s\
8db0: 6e 22 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20  n", argv[1]);.  
8dc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8dd0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  ..../*.** Usage:
8de0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
8df0: 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54  f_int FORMAT INT
8e00: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
8e10: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
8e20: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
8e30: 65 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  ee integer argum
8e40: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ents.*/.static i
8e50: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
8e60: 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  tf_int(.  void *
8e70: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8e80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8e90: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8ea0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8eb0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
8ec0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
8ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8ee0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
8ef0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
8f00: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
8f10: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8f20: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8f30: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
8f40: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
8f50: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
8f60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8f70: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
8f80: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
8f90: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8fa0: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
8fb0: 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20  INT INT INT\"", 
8fc0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
8fd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
8fe0: 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b  for(i=2; i<5; i+
8ff0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
9000: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9010: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9020: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9030: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9040: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9050: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9060: 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c  1], a[2]);.  Tcl
9070: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9080: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
9090: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
90a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
90b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
90c0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
90d0: 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41 54 20 49  f_int64 FORMAT I
90e0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49  NTEGER INTEGER I
90f0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c  NTEGER.**.** Cal
9100: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
9110: 68 72 65 65 20 36 34 2d 62 69 74 20 69 6e 74 65  hree 64-bit inte
9120: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  ger arguments.*/
9130: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9140: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
9150: 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  4(.  void *NotUs
9160: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
9170: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
9180: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
9190: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
91a0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
91b0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
91c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
91d0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
91e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
91f0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
9200: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
9210: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
9220: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  t i;.  sqlite_in
9230: 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61 72  t64 a[3];.  char
9240: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
9250: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
9260: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9270: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9280: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9290: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
92a0: 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e   " FORMAT INT IN
92b0: 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20  T INT\"", 0);.  
92c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
92d0: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
92e0: 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<5; i++){.  
92f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f    if( sqlite3Ato
9300: 69 36 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b  i64(argv[i], &a[
9310: 69 2d 32 5d 2c 20 31 30 30 30 30 30 30 2c 20 53  i-2], 1000000, S
9320: 51 4c 49 54 45 5f 55 54 46 38 29 20 29 7b 0a 20  QLITE_UTF8) ){. 
9330: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
9340: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
9350: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  rgument is not a
9360: 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e   valid 64-bit in
9370: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
9380: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9390: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
93a0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
93b0: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
93c0: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
93d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
93e0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
93f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9400: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
9410: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
9420: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
9430: 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d  printf_long FORM
9440: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
9450: 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a  ER INTEGER.**.**
9460: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9470: 74 68 20 74 68 72 65 65 20 6c 6f 6e 67 20 69 6e  th three long in
9480: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 2e  teger arguments.
9490: 20 20 20 54 68 69 73 20 6d 69 67 68 74 20 62 65     This might be
94a0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
94b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
94c0: 69 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d  int or sqlite3_m
94d0: 70 72 69 6e 74 66 5f 69 6e 74 36 34 2c 20 64 65  printf_int64, de
94e0: 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c  pending on.** pl
94f0: 61 74 66 6f 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  atform..*/.stati
9500: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
9510: 72 69 6e 74 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f  rintf_long(.  vo
9520: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9530: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9540: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9550: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9560: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9570: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9580: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
9590: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
95a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
95b0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
95c0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
95d0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
95e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
95f0: 6c 6f 6e 67 20 69 6e 74 20 61 5b 33 5d 3b 0a 20  long int a[3];. 
9600: 20 69 6e 74 20 62 5b 33 5d 3b 0a 20 20 63 68 61   int b[3];.  cha
9610: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9620: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
9630: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9640: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9650: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9660: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9670: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
9680: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
9690: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
96a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
96b0: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
96c0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
96d0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
96e0: 5d 2c 20 26 62 5b 69 2d 32 5d 29 20 29 20 72 65  ], &b[i-2]) ) re
96f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9700: 20 20 20 20 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f      a[i-2] = (lo
9710: 6e 67 20 69 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20  ng int)b[i-2];. 
9720: 20 20 20 61 5b 69 2d 32 5d 20 26 3d 20 28 28 28     a[i-2] &= (((
9730: 75 36 34 29 31 29 3c 3c 28 73 69 7a 65 6f 66 28  u64)1)<<(sizeof(
9740: 69 6e 74 29 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a  int)*8))-1;.  }.
9750: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
9760: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
9770: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
9780: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
9790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
97a0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
97b0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
97c0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
97d0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
97e0: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52  _mprintf_str FOR
97f0: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
9800: 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  GER STRING.**.**
9810: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9820: 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61  th two integer a
9830: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65  rguments and one
9840: 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74   string argument
9850: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
9860: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
9870: 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tr(.  void *NotU
9880: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9890: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
98a0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
98b0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
98c0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
98d0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
98e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
98f0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9900: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9910: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9920: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
9930: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
9940: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
9950: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9960: 63 3c 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b  c<4 || argc>5 ){
9970: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9980: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9990: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
99a0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
99b0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
99c0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54  RMAT INT INT ?ST
99d0: 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20  RING?\"", 0);.  
99e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
99f0: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9a00: 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<4; i++){.  
9a10: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9a20: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9a30: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &a[i-2]) ) ret
9a40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9a50: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
9a60: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
9a70: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
9a80: 67 63 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a  gc>4 ? argv[4] :
9a90: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
9aa0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9ab0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9ac0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9ad0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9ae0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9af0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
9b00: 73 74 72 20 49 4e 54 45 47 45 52 20 46 4f 52 4d  str INTEGER FORM
9b10: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
9b20: 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  ER STRING.**.** 
9b30: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9b40: 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72  h two integer ar
9b50: 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20  guments and one 
9b60: 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a  string argument.
9b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9b80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
9b90: 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tr(.  void *NotU
9ba0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9bb0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9bc0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9bd0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9be0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9bf0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9c10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9c20: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9c30: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9c40: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
9c50: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
9c60: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e  nt a[3], i;.  in
9c70: 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t n;.  char *z;.
9c80: 20 20 69 66 28 20 61 72 67 63 3c 35 20 7c 7c 20    if( argc<5 || 
9c90: 61 72 67 63 3e 36 20 29 7b 0a 20 20 20 20 54 63  argc>6 ){.    Tc
9ca0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9cb0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
9cc0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
9cd0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
9ce0: 20 20 20 20 20 22 20 49 4e 54 20 46 4f 52 4d 41       " INT FORMA
9cf0: 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e  T INT INT ?STRIN
9d00: 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  G?\"", 0);.    r
9d10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9d20: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
9d30: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9d40: 67 76 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74  gv[1], &n) ) ret
9d50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9d60: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
9d70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9d80: 28 69 6e 74 65 72 70 2c 20 22 4e 20 6d 75 73 74  (interp, "N must
9d90: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
9da0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9db0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9dc0: 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 35 3b  .  for(i=3; i<5;
9dd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9de0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9df0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
9e00: 33 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  3]) ) return TCL
9e10: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
9e20: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
9e30: 28 20 6e 2b 31 20 29 3b 0a 20 20 73 71 6c 69 74  ( n+1 );.  sqlit
9e40: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
9e50: 2c 20 61 72 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c  , argv[2], a[0],
9e60: 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20   a[1], argc>4 ? 
9e70: 61 72 67 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b  argv[5] : NULL);
9e80: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
9e90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
9ea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9eb0: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
9ec0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
9ed0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
9ee0: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 46  mprintf_double F
9ef0: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
9f00: 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a  TEGER DOUBLE.**.
9f10: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9f20: 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72  with two integer
9f30: 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f   arguments and o
9f40: 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  ne double argume
9f50: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  nt.*/.static int
9f60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9f70: 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
9f80: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9f90: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9fa0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9fb0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9fc0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
9fd0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
9fe0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9ff0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a000: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
a010: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
a020: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
a030: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
a040: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
a050: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63  .  double r;.  c
a060: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
a070: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
a080: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a090: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a0a0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a0b0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
a0c0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
a0d0: 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22 2c 20   INT DOUBLE\"", 
a0e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a0f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a100: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
a110: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
a120: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
a130: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
a140: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a150: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
a160: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74  cl_GetDouble(int
a170: 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72  erp, argv[4], &r
a180: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a190: 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  RROR;.  z = sqli
a1a0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
a1b0: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
a1c0: 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e   r);.  Tcl_Appen
a1d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a1e0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
a1f0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
a200: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
a210: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
a220: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
a230: 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45  ed FORMAT DOUBLE
a240: 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61   DOUBLE.**.** Ca
a250: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
a260: 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20  a single double 
a270: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
a280: 73 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66  s the product of
a290: 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75   the.** two argu
a2a0: 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76  ments given abov
a2b0: 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
a2c0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65   to generate ove
a2d0: 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66  rflow and underf
a2e0: 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74  low.** doubles t
a2f0: 6f 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79  o test that they
a300: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70   are converted p
a310: 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74  roperly..*/.stat
a320: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
a330: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
a340: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a350: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a360: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a370: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a380: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a390: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a3a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a3b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a3c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a3d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a3f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a400: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
a410: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
a420: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
a430: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
a440: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a450: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a460: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a470: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a480: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a490: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
a4a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a4b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a4c0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
a4d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
a4e0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a4f0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
a500: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a510: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a530: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
a540: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
a550: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a560: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a570: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a580: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a590: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a5a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a5b0: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
a5c0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
a5d0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
a5e0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
a5f0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
a600: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
a610: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
a620: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
a630: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
a640: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
a650: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
a660: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
a670: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
a680: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
a690: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
a6a0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
a6b0: 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20  intf_stronly(.  
a6c0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
a6d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
a6e0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
a6f0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
a700: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
a710: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
a720: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
a730: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a740: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a750: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
a760: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
a770: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
a780: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
a790: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
a7a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
a7b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a7c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
a7d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
a7e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
a7f0: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22  FORMAT STRING\""
a800: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a820: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
a830: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
a840: 72 67 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  rgv[2]);.  Tcl_A
a850: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a860: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a870: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a880: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a890: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a8a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a8b0: 68 65 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54  hexdouble FORMAT
a8c0: 20 48 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20   HEX.**.** Call 
a8d0: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73  mprintf with a s
a8e0: 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67  ingle double arg
a8f0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 64  ument which is d
a900: 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  erived from the.
a910: 2a 2a 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65  ** hexadecimal e
a920: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45  ncoding of an IE
a930: 45 45 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74  EE double..*/.st
a940: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
a950: 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
a960: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  le(.  void *NotU
a970: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a980: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a990: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a9a0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a9b0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a9c0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a9e0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a9f0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
aa00: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
aa10: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
aa20: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
aa30: 68 61 72 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65  har *z;.  double
aa40: 20 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   r;.  unsigned i
aa50: 6e 74 20 78 31 2c 20 78 32 3b 0a 20 20 73 71 6c  nt x1, x2;.  sql
aa60: 69 74 65 5f 75 69 6e 74 36 34 20 64 3b 0a 20 20  ite_uint64 d;.  
aa70: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
aa80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
aa90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
aaa0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
aab0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
aac0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
aad0: 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29  AT STRING\"", 0)
aae0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
aaf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
ab00: 28 20 73 73 63 61 6e 66 28 61 72 67 76 5b 32 5d  ( sscanf(argv[2]
ab10: 2c 20 22 25 30 38 78 25 30 38 78 22 2c 20 26 78  , "%08x%08x", &x
ab20: 32 2c 20 26 78 31 29 21 3d 32 20 29 7b 0a 20 20  2, &x1)!=2 ){.  
ab30: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ab40: 6c 74 28 69 6e 74 65 72 70 2c 20 22 32 6e 64 20  lt(interp, "2nd 
ab50: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
ab60: 62 65 20 31 36 2d 63 68 61 72 61 63 74 65 72 73  be 16-characters
ab70: 20 6f 66 20 68 65 78 22 2c 20 30 29 3b 0a 20 20   of hex", 0);.  
ab80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ab90: 4f 52 3b 0a 20 20 7d 0a 20 20 64 20 3d 20 78 32  OR;.  }.  d = x2
aba0: 3b 0a 20 20 64 20 3d 20 28 64 3c 3c 33 32 29 20  ;.  d = (d<<32) 
abb0: 2b 20 78 31 3b 0a 20 20 6d 65 6d 63 70 79 28 26  + x1;.  memcpy(&
abc0: 72 2c 20 26 64 2c 20 73 69 7a 65 6f 66 28 72 29  r, &d, sizeof(r)
abd0: 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
abe0: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
abf0: 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  , r);.  Tcl_Appe
ac00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ac10: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
ac20: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
ac30: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
ac40: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
ac50: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
ac60: 64 5f 63 61 63 68 65 20 3f 42 4f 4f 4c 45 41 4e  d_cache ?BOOLEAN
ac70: 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ?.**.*/.#if !def
ac80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ac90: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 73  _SHARED_CACHE).s
aca0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
acb0: 6e 61 62 6c 65 5f 73 68 61 72 65 64 28 0a 20 20  nable_shared(.  
acc0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
acd0: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
ace0: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
acf0: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
ad00: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
ad10: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
ad20: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
ad30: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
ad40: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
ad50: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
ad60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ad70: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
ad80: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
ad90: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
ada0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
adb0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
adc0: 3b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a  ;.  int enable;.
add0: 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a    int ret = 0;..
ade0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
adf0: 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
ae00: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
ae10: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
ae20: 2c 20 22 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a  , "?BOOLEAN?");.
ae30: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ae40: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 20  RROR;.  }.  ret 
ae50: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
ae60: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
ae70: 65 45 6e 61 62 6c 65 64 3b 0a 0a 20 20 69 66 28  eEnabled;..  if(
ae80: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
ae90: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
aea0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
aeb0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62  , objv[1], &enab
aec0: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  le) ){.      ret
aed0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aee0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
aef0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
af00: 72 65 64 5f 63 61 63 68 65 28 65 6e 61 62 6c 65  red_cache(enable
af10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
af20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
af30: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
af40: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
af50: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
af60: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
af70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
af80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
af90: 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
afa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
afb0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
afc0: 65 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  et));.  return T
afd0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
afe0: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
aff0: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
b000: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 20 20  _result_codes   
b010: 44 42 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a  DB    BOOLEAN.**
b020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b030: 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  est_extended_res
b040: 75 6c 74 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69  ult_codes(.  Cli
b050: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
b060: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
b070: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
b080: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
b090: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b0a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
b0b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
b0c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
b0d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
b0e0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
b0f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b100: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
b110: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
b120: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
b130: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
b140: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c  /.){.  int enabl
b150: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b160: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
b170: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
b180: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b190: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f   1, objv, "DB BO
b1a0: 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74  OLEAN");.    ret
b1b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b1c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
b1d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
b1e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b1f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
b200: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b210: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
b220: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
b230: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61  p, objv[2], &ena
b240: 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  ble) ) return TC
b250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
b260: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
b270: 6c 74 5f 63 6f 64 65 73 28 64 62 2c 20 65 6e 61  lt_codes(db, ena
b280: 62 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ble);.  return T
b290: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b2a0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c  Usage: sqlite3_l
b2b0: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
b2c0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
b2d0: 74 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f  t test_libversio
b2e0: 6e 5f 6e 75 6d 62 65 72 28 0a 20 20 43 6c 69 65  n_number(.  Clie
b2f0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
b300: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
b310: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
b320: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
b330: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b340: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
b350: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
b360: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
b370: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
b380: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
b390: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b3a0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
b3b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
b3c0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
b3d0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
b3e0: 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  .){.  Tcl_SetObj
b3f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
b400: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
b410: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
b420: 6e 75 6d 62 65 72 28 29 29 29 3b 0a 20 20 72 65  number()));.  re
b430: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
b440: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
b450: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b460: 6e 5f 6d 65 74 61 64 61 74 61 20 44 42 20 64 62  n_metadata DB db
b470: 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c  name tblname col
b480: 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a 23 69 66 64 65  name.**.*/.#ifde
b490: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b4a0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
b4b0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
b4c0: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
b4d0: 61 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44  adata(.  ClientD
b4e0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
b4f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
b500: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
b510: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
b520: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b530: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
b540: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
b550: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
b560: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
b570: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
b580: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b590: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
b5a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
b5b0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
b5c0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
b5d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
b5e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
b5f0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
b600: 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  *zTbl;.  const c
b610: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74  har *zCol;.  int
b620: 20 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a   rc;.  Tcl_Obj *
b630: 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  pRet;..  const c
b640: 68 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a  har *zDatatype;.
b650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
b660: 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f  ollseq;.  int no
b670: 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69  tnull;.  int pri
b680: 6d 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61  marykey;.  int a
b690: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20  utoincrement;.. 
b6a0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
b6b0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
b6c0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
b6d0: 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e 61 6d 65  objv, "DB dbname
b6e0: 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65   tblname colname
b6f0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
b700: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
b710: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
b720: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b730: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b740: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
b750: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 20  CL_ERROR;.  zDb 
b760: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
b770: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c  objv[2]);.  zTbl
b780: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
b790: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f  (objv[3]);.  zCo
b7a0: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
b7b0: 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 69  g(objv[4]);..  i
b7c0: 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29 3d 3d  f( strlen(zDb)==
b7d0: 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a 20 20  0 ) zDb = 0;..  
b7e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
b7f0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
b800: 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54 62 6c  ta(db, zDb, zTbl
b810: 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20 20 26  , zCol, .      &
b820: 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43 6f 6c  zDatatype, &zCol
b830: 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20  lseq, &notnull, 
b840: 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26 61 75  &primarykey, &au
b850: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a 20  toincrement);.. 
b860: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b870: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
b880: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b890: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
b8a0: 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
b8b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b8c0: 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54  .  }..  pRet = T
b8d0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
b8e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b8f0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b900: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
b910: 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d 31 29  j(zDatatype, -1)
b920: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
b930: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
b940: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
b950: 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71  ringObj(zCollseq
b960: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
b970: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b980: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
b990: 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c  NewIntObj(notnul
b9a0: 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  l));.  Tcl_ListO
b9b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b9c0: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b9d0: 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79 6b 65  IntObj(primaryke
b9e0: 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  y));.  Tcl_ListO
b9f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ba00: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
ba10: 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63 72 65  IntObj(autoincre
ba20: 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65  ment));.  Tcl_Se
ba30: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ba40: 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74  p, pRet);..  ret
ba50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
ba60: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
ba70: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
ba80: 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 62  OB..static int b
ba90: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
baa0: 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  (.  Tcl_Interp *
bab0: 69 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f 4f  interp, .  Tcl_O
bac0: 62 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c 69  bj *pObj,.  sqli
bad0: 74 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f  te3_blob **ppBlo
bae0: 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  b.){.  char *z;.
baf0: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20    int n;..  z = 
bb00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
bb10: 6d 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a  mObj(pObj, &n);.
bb20: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
bb30: 20 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a 20    *ppBlob = 0;. 
bb40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
bb50: 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 54 63 6c  notUsed;.    Tcl
bb60: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
bb70: 3b 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  ;.    ClientData
bb80: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20   instanceData;. 
bb90: 20 20 20 0a 20 20 20 20 63 68 61 6e 6e 65 6c 20     .    channel 
bba0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
bbb0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 26 6e 6f 74  (interp, z, &not
bbc0: 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 21  Used);.    if( !
bbd0: 63 68 61 6e 6e 65 6c 20 29 20 72 65 74 75 72 6e  channel ) return
bbe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 20   TCL_ERROR;..   
bbf0: 20 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 6e   Tcl_Flush(chann
bc00: 65 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 65  el);.    Tcl_See
bc10: 6b 28 63 68 61 6e 6e 65 6c 2c 20 30 2c 20 53 45  k(channel, 0, SE
bc20: 45 4b 5f 53 45 54 29 3b 0a 0a 20 20 20 20 69 6e  EK_SET);..    in
bc30: 73 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c  stanceData = Tcl
bc40: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
bc50: 6e 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29  nceData(channel)
bc60: 3b 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20  ;.    *ppBlob = 
bc70: 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  *((sqlite3_blob 
bc80: 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29  **)instanceData)
bc90: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
bca0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
bcb0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
bcc0: 74 65 73 20 20 43 48 41 4e 4e 45 4c 0a 2a 2f 0a  tes  CHANNEL.*/.
bcd0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
bce0: 62 6c 6f 62 5f 62 79 74 65 73 28 0a 20 20 43 6c  blob_bytes(.  Cl
bcf0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
bd00: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
bd10: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
bd20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
bd30: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
bd40: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
bd50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
bd60: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
bd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bd80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
bd90: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
bda0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
bdb0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
bdc0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
bdd0: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
bde0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 0a 20   int nByte;.  . 
bdf0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
be00: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
be10: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
be20: 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 22 29  objv, "CHANNEL")
be30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
be40: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
be50: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
be60: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
be70: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
be80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
be90: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 71 6c 69  ;.  nByte = sqli
bea0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
beb0: 42 6c 6f 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Blob);.  Tcl_Set
bec0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
bed0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
bee0: 6e 42 79 74 65 29 29 3b 0a 0a 20 20 72 65 74 75  nByte));..  retu
bef0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
bf00: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  .** sqlite3_blob
bf10: 5f 63 6c 6f 73 65 20 20 43 48 41 4e 4e 45 4c 0a  _close  CHANNEL.
bf20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
bf30: 73 74 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 0a 20  st_blob_close(. 
bf40: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
bf50: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
bf60: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
bf70: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
bf80: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
bf90: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
bfa0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
bfb0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bfd0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
bfe0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
bff0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
c000: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
c010: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
c020: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
c030: 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
c040: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
c050: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c060: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41  p, 1, objv, "CHA
c070: 4e 4e 45 4c 22 29 3b 0a 20 20 20 20 72 65 74 75  NNEL");.    retu
c080: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c090: 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e  }..  if( blobHan
c0a0: 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dleFromObj(inter
c0b0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c  p, objv[1], &pBl
c0c0: 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ob) ) return TCL
c0d0: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
c0e0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
c0f0: 6f 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  ob);..  return T
c100: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
c110: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
c120: 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  d  CHANNEL OFFSE
c130: 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  T N.**.**   This
c140: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
c150: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c   to test the sql
c160: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
c170: 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a   in ways that.**
c180: 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e     the Tcl chann
c190: 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  el interface doe
c1a0: 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74  s not. The first
c1b0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
c1c0: 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d  .**   be the nam
c1d0: 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61  e of a valid cha
c1e0: 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20  nnel created by 
c1f0: 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d  the [incrblob] m
c200: 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20  ethod.**   of a 
c210: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
c220: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
c230: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f  alls sqlite3_blo
c240: 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20 20 74 6f  b_read().**   to
c250: 20 72 65 61 64 20 4e 20 62 79 74 65 73 20 66 72   read N bytes fr
c260: 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54  om offset OFFSET
c270: 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
c280: 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20 20  ying SQLite.**  
c290: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a   blob handle..**
c2a0: 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73  .**   On success
c2b0: 2c 20 61 20 62 79 74 65 2d 61 72 72 61 79 20 6f  , a byte-array o
c2c0: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
c2d0: 20 74 68 65 20 72 65 61 64 20 64 61 74 61 20 69   the read data i
c2e0: 73 20 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65 64  s .**   returned
c2f0: 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  . On failure, th
c300: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65  e interpreter re
c310: 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74  sult is set to t
c320: 68 65 0a 2a 2a 20 20 20 74 65 78 74 20 72 65 70  he.**   text rep
c330: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
c340: 68 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  he returned erro
c350: 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 22 53 51  r code (i.e. "SQ
c360: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20  LITE_NOMEM").** 
c370: 20 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65    and a Tcl exce
c380: 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e  ption is thrown.
c390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
c3a0: 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20  est_blob_read(. 
c3b0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
c3c0: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
c3d0: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
c3e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
c3f0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
c400: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
c410: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
c420: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c440: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
c450: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
c460: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
c470: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
c480: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
c490: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
c4a0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
c4b0: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
c4c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
c4d0: 42 75 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Buf = 0;.  int r
c4e0: 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  c;.  .  if( objc
c4f0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
c500: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
c510: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
c520: 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 22 29  ANNEL OFFSET N")
c530: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c540: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
c550: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
c560: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
c570: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
c580: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c590: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
c5a0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
c5b0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
c5c0: 5d 2c 20 26 69 4f 66 66 73 65 74 29 0a 20 20 20  ], &iOffset).   
c5d0: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
c5e0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
c5f0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
c600: 42 79 74 65 29 0a 20 20 29 7b 20 0a 20 20 20 20  Byte).  ){ .    
c610: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c620: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 42 79  ;.  }..  if( nBy
c630: 74 65 3e 30 20 29 7b 0a 20 20 20 20 7a 42 75 66  te>0 ){.    zBuf
c640: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
c650: 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42  r *)Tcl_Alloc(nB
c660: 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  yte);.  }.  rc =
c670: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
c680: 61 64 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20  ad(pBlob, zBuf, 
c690: 6e 42 79 74 65 2c 20 69 4f 66 66 73 65 74 29 3b  nByte, iOffset);
c6a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c6b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
c6c0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
c6d0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
c6e0: 41 72 72 61 79 4f 62 6a 28 7a 42 75 66 2c 20 6e  ArrayObj(zBuf, n
c6f0: 42 79 74 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Byte));.  }else{
c700: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
c710: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
c720: 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45 72   *)sqlite3TestEr
c730: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
c740: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a  _VOLATILE);.  }.
c750: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
c760: 20 2a 29 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74   *)zBuf);..  ret
c770: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
c780: 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43  OK ? TCL_OK : TC
c790: 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a  L_ERROR);.}../*.
c7a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ** sqlite3_blob_
c7b0: 77 72 69 74 65 20 43 48 41 4e 4e 45 4c 20 4f 46  write CHANNEL OF
c7c0: 46 53 45 54 20 44 41 54 41 20 3f 4e 44 41 54 41  FSET DATA ?NDATA
c7d0: 3f 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63  ?.**.**   This c
c7e0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
c7f0: 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74  o test the sqlit
c800: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 20  e3_blob_write() 
c810: 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a 20  in ways that.** 
c820: 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e 65    the Tcl channe
c830: 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  l interface does
c840: 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74 20   not. The first 
c850: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a  argument should.
c860: 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d 65  **   be the name
c870: 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61 6e   of a valid chan
c880: 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20 74  nel created by t
c890: 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65  he [incrblob] me
c8a0: 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64  thod.**   of a d
c8b0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
c8c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  This function ca
c8d0: 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  lls sqlite3_blob
c8e0: 5f 77 72 69 74 65 28 29 0a 2a 2a 20 20 20 74 6f  _write().**   to
c8f0: 20 77 72 69 74 65 20 74 68 65 20 44 41 54 41 20   write the DATA 
c900: 62 79 74 65 2d 61 72 72 61 79 20 74 6f 20 74 68  byte-array to th
c910: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c  e underlying SQL
c920: 69 74 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e  ite blob handle.
c930: 0a 2a 2a 20 20 20 61 74 20 6f 66 66 73 65 74 20  .**   at offset 
c940: 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  OFFSET..**.**   
c950: 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 6e 20 65  On success, an e
c960: 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 72  mpty string is r
c970: 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c  eturned. On fail
c980: 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72  ure, the interpr
c990: 65 74 65 72 0a 2a 2a 20 20 20 72 65 73 75 6c 74  eter.**   result
c9a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 74   is set to the t
c9b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
c9c0: 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  on of the return
c9d0: 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a  ed error code .*
c9e0: 2a 20 20 20 28 69 2e 65 2e 20 22 53 51 4c 49 54  *   (i.e. "SQLIT
c9f0: 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64 20 61 20  E_NOMEM") and a 
ca00: 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69 73  Tcl exception is
ca10: 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74   thrown..*/.stat
ca20: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
ca30: 5f 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74  _write(.  Client
ca40: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
ca50: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
ca60: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
ca70: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
ca80: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
ca90: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
caa0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
cab0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
cac0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cad0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
cae0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
caf0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
cb00: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
cb10: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  .){.  sqlite3_bl
cb20: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
cb30: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
cb40: 72 63 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20  rc;..  unsigned 
cb50: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e  char *zBuf;.  in
cb60: 74 20 6e 42 75 66 3b 0a 20 20 0a 20 20 69 66 28  t nBuf;.  .  if(
cb70: 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
cb80: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
cb90: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
cba0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
cbb0: 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44 41 54  ANNEL OFFSET DAT
cbc0: 41 20 3f 4e 44 41 54 41 3f 22 29 3b 0a 20 20 20  A ?NDATA?");.   
cbd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
cbe0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
cbf0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
cc00: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
cc10: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
cc20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
cc30: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
cc40: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
cc50: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
cc60: 4f 66 66 73 65 74 29 20 29 7b 20 0a 20 20 20 20  Offset) ){ .    
cc70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cc80: 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20  ;.  }..  zBuf = 
cc90: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
cca0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
ccb0: 20 26 6e 42 75 66 29 3b 0a 20 20 69 66 28 20 6f   &nBuf);.  if( o
ccc0: 62 6a 63 3d 3d 35 20 26 26 20 54 63 6c 5f 47 65  bjc==5 && Tcl_Ge
ccd0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
cce0: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 42  rp, objv[4], &nB
ccf0: 75 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  uf) ){.    retur
cd00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cd10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
cd20: 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62  blob_write(pBlob
cd30: 2c 20 7a 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , zBuf, nBuf, iO
cd40: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
cd50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cd60: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
cd70: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
cd80: 29 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f  )sqlite3TestErro
cd90: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56  rName(rc), TCL_V
cda0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20  OLATILE);.  }.. 
cdb0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
cdc0: 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20  ITE_OK ? TCL_OK 
cdd0: 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  : TCL_ERROR);.}.
cde0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
cdf0: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 0a 20 20  _blob_reopen(.  
ce00: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
ce10: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
ce20: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
ce30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
ce40: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
ce50: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
ce60: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
ce70: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ce90: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
cea0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
ceb0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
cec0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
ced0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
cee0: 57 69 64 65 49 6e 74 20 69 52 6f 77 69 64 3b 0a  WideInt iRowid;.
cef0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
cf00: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
cf10: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
cf20: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
cf30: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cf40: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
cf50: 4c 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 72  L ROWID");.    r
cf60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cf70: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62  .  }..  if( blob
cf80: 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  HandleFromObj(in
cf90: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
cfa0: 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20  pBlob) ) return 
cfb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
cfc0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
cfd0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
cfe0: 62 6a 76 5b 32 5d 2c 20 26 69 52 6f 77 69 64 29  bjv[2], &iRowid)
cff0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d000: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
d010: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
d020: 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b  (pBlob, iRowid);
d030: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d040: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
d050: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
d060: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
d070: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
d080: 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  c), TCL_VOLATILE
d090: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
d0a0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
d0b0: 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45  ? TCL_OK : TCL_E
d0c0: 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  RROR);.}..#endif
d0d0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
d0e0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
d0f0: 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41  llation_v2 DB-HA
d100: 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52  NDLE NAME CMP-PR
d110: 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a  OC DEL-PROC.**.*
d120: 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f  *   This Tcl pro
d130: 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  c is used for te
d140: 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72 69  sting the experi
d150: 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69  mental.**   sqli
d160: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
d170: 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66  tion_v2() interf
d180: 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54  ace..*/.struct T
d190: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a  estCollationX {.
d1a0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d1b0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
d1c0: 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pCmp;.  Tcl_Obj
d1d0: 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64   *pDel;.};.typed
d1e0: 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43 6f  ef struct TestCo
d1f0: 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c  llationX TestCol
d200: 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20  lationX;.static 
d210: 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65 43  void testCreateC
d220: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64  ollationDel(void
d230: 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43   *pCtx){.  TestC
d240: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28  ollationX *p = (
d250: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
d260: 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63  )pCtx;..  int rc
d270: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
d280: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70  (p->interp, p->p
d290: 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Del, TCL_EVAL_DI
d2a0: 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c  RECT|TCL_EVAL_GL
d2b0: 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21  OBAL);.  if( rc!
d2c0: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  =TCL_OK ){.    T
d2d0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
d2e0: 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  or(p->interp);. 
d2f0: 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65   }..  Tcl_DecrRe
d300: 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b  fCount(p->pCmp);
d310: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
d320: 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20  unt(p->pDel);.  
d330: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f  sqlite3_free((vo
d340: 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69  id *)p);.}.stati
d350: 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74 65  c int testCreate
d360: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20  CollationCmp(.  
d370: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
d380: 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74  t nLeft,.  const
d390: 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20   void *zLeft,.  
d3a0: 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f  int nRight,.  co
d3b0: 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74  nst void *zRight
d3c0: 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  .){.  TestCollat
d3d0: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
d3e0: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
d3f0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
d400: 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69  ript = Tcl_Dupli
d410: 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29  cateObj(p->pCmp)
d420: 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30  ;.  int iRes = 0
d430: 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  ;..  Tcl_IncrRef
d440: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
d450: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
d460: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
d470: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
d480: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
d490: 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a  zLeft, nLeft));.
d4a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
d4b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
d4c0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
d4d0: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
d4e0: 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b  zRight,nRight));
d4f0: 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
d500: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
d510: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
d520: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
d530: 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  T|TCL_EVAL_GLOBA
d540: 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21  L).   || TCL_OK!
d550: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
d560: 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63  bj(p->interp, Tc
d570: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_GetObjResult(p
d580: 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73  ->interp), &iRes
d590: 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  ).  ){.    Tcl_B
d5a0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
d5b0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  ->interp);.  }. 
d5c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
d5d0: 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72  t(pScript);..  r
d5e0: 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74  eturn iRes;.}.st
d5f0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
d600: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
d610: 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  2(.  ClientData 
d620: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
d630: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
d640: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d650: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
d660: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
d670: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
d680: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
d690: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
d6a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
d6b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
d6c0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d6d0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
d6e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
d6f0: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
d700: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
d710: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
d720: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
d730: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d740: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d750: 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20  bjv, "DB-HANDLE 
d760: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
d770: 4c 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65  L-PROC");.    re
d780: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d790: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
d7a0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
d7b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d7c0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
d7d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d7e0: 0a 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c  .  p = (TestColl
d7f0: 61 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33  ationX *)sqlite3
d800: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54  _malloc(sizeof(T
d810: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b  estCollationX));
d820: 0a 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a  .  p->pCmp = obj
d830: 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20  v[3];.  p->pDel 
d840: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e  = objv[4];.  p->
d850: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
d860: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
d870: 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20  unt(p->pCmp);.  
d880: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
d890: 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63  (p->pDel);..  rc
d8a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
d8b0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64  e_collation_v2(d
d8c0: 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  b, Tcl_GetString
d8d0: 28 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a  (objv[2]), 16, .
d8e0: 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c        (void *)p,
d8f0: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
d900: 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65  tionCmp, testCre
d910: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a  ateCollationDel.
d920: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
d930: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a  QLITE_MISUSE ){.
d940: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d950: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71  sult(interp, "sq
d960: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
d970: 6c 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64  late_v2() failed
d980: 20 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20   to detect ".   
d990: 20 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65     "an invalid e
d9a0: 6e 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a  ncoding", (char*
d9b0: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
d9c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d9d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
d9e0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
d9f0: 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72  2(db, Tcl_GetStr
da00: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51  ing(objv[2]), SQ
da10: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
da20: 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73    (void *)p, tes
da30: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
da40: 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  Cmp, testCreateC
da50: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b  ollationDel.  );
da60: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
da70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45  ;.}../*.** USAGE
da80: 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  : sqlite3_create
da90: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20  _function_v2 DB 
daa0: 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53  NAME NARG ENC ?S
dab0: 57 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41  WITCHES?.**.** A
dac0: 76 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65  vailable switche
dad0: 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d  s are:.**.**   -
dae0: 66 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a  func    SCRIPT.*
daf0: 2a 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52  *   -step    SCR
db00: 49 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20  IPT.**   -final 
db10: 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64    SCRIPT.**   -d
db20: 65 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f  estroy SCRIPT.*/
db30: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
db40: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
db50: 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56   CreateFunctionV
db60: 32 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65  2;.struct Create
db70: 46 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54  FunctionV2 {.  T
db80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
db90: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46  p;.  Tcl_Obj *pF
dba0: 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  unc;            
dbb0: 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66       /* Script f
dbc0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  or function invo
dbd0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  cation */.  Tcl_
dbe0: 4f 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20  Obj *pStep;     
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dc00: 63 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73  cript for agg. s
dc10: 74 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  tep invocation *
dc20: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69  /.  Tcl_Obj *pFi
dc30: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
dc40: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
dc50: 72 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74  r agg. finalizat
dc60: 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  ion invocation *
dc70: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65  /.  Tcl_Obj *pDe
dc80: 73 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20  stroy;          
dc90: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
dca0: 72 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73  r script */.};.s
dcb0: 74 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75  tatic void cf2Fu
dcc0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
dcd0: 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72  xt *ctx, int nAr
dce0: 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  g, sqlite3_value
dcf0: 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74   **aArg){.}.stat
dd00: 69 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28  ic void cf2Step(
dd10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
dd20: 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20  *ctx, int nArg, 
dd30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
dd40: 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20  aArg){.}.static 
dd50: 76 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71  void cf2Final(sq
dd60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
dd70: 74 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  tx){.}.static vo
dd80: 69 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f  id cf2Destroy(vo
dd90: 69 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72  id *pUser){.  Cr
dda0: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a  eateFunctionV2 *
ddb0: 70 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74  p = (CreateFunct
ddc0: 69 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a  ionV2 *)pUser;..
ddd0: 20 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20    if( p->interp 
dde0: 26 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  && p->pDestroy )
ddf0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54  {.    int rc = T
de00: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
de10: 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74  interp, p->pDest
de20: 72 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  roy, 0);.    if(
de30: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63   rc!=TCL_OK ) Tc
de40: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
de50: 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  r(p->interp);.  
de60: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e  }..  if( p->pFun
de70: 63 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43  c ) Tcl_DecrRefC
de80: 6f 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20  ount(p->pFunc); 
de90: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
dea0: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
deb0: 6e 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20  nt(p->pStep); . 
dec0: 20 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29   if( p->pFinal )
ded0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
dee0: 74 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20  t(p->pFinal); . 
def0: 20 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79   if( p->pDestroy
df00: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
df10: 75 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29  unt(p->pDestroy)
df20: 3b 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ; .  sqlite3_fre
df30: 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  e(p);.}.static i
df40: 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66  nt test_create_f
df50: 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c  unction_v2(.  Cl
df60: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
df70: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ata,          /*
df80: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
df90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
dfa0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
dfb0: 2a 20 54 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54  * The invoking T
dfc0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  CL interpreter *
dfd0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e000: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
e010: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
e020: 62 6a 76 5b 5d 20 20 20 20 20 20 20 20 20 20 20  bjv[]           
e030: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
e040: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
e050: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
e060: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20  t char *zFunc;. 
e070: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74   int nArg;.  int
e080: 20 65 6e 63 3b 0a 20 20 43 72 65 61 74 65 46 75   enc;.  CreateFu
e090: 6e 63 74 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69  nctionV2 *p;.  i
e0a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
e0b0: 0a 20 20 73 74 72 75 63 74 20 45 6e 63 54 61 62  .  struct EncTab
e0c0: 6c 65 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  le {.    const c
e0d0: 68 61 72 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69  har *zEnc;.    i
e0e0: 6e 74 20 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63  nt enc;.  } aEnc
e0f0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66  [] = {.    {"utf
e100: 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54  8",    SQLITE_UT
e110: 46 38 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31  F8 },.    {"utf1
e120: 36 22 2c 20 20 20 53 51 4c 49 54 45 5f 55 54 46  6",   SQLITE_UTF
e130: 31 36 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31  16 },.    {"utf1
e140: 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6le", SQLITE_UTF
e150: 31 36 4c 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74  16LE },.    {"ut
e160: 66 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55  f16be", SQLITE_U
e170: 54 46 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22  TF16BE },.    {"
e180: 61 6e 79 22 2c 20 20 20 20 20 53 51 4c 49 54 45  any",     SQLITE
e190: 5f 41 4e 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22  _ANY },.    {"0"
e1a0: 2c 20 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66  , 0 }.  };..  if
e1b0: 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a  ( objc<5 || (obj
e1c0: 63 25 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54  c%2)==0 ){.    T
e1d0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e1e0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
e1f0: 20 22 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45   "DB NAME NARG E
e200: 4e 43 20 53 57 49 54 43 48 45 53 2e 2e 2e 22 29  NC SWITCHES...")
e210: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e220: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
e230: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
e240: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
e250: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
e260: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
e270: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63  L_ERROR;.  zFunc
e280: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e290: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
e2a0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
e2b0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
e2c0: 33 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74  3], &nArg) ) ret
e2d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e2e0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
e2f0: 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69  xFromObjStruct(i
e300: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
e310: 61 45 6e 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e  aEnc, sizeof(aEn
e320: 63 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  c[0]), .        
e330: 20 20 22 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c    "encoding", 0,
e340: 20 26 65 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20   &enc).  ){.    
e350: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e360: 3b 0a 20 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45  ;.  }.  enc = aE
e370: 6e 63 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20  nc[enc].enc;..  
e380: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
e390: 6f 63 28 73 69 7a 65 6f 66 28 43 72 65 61 74 65  oc(sizeof(Create
e3a0: 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20  FunctionV2));.  
e3b0: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 6d  assert( p );.  m
e3c0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
e3d0: 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f  of(CreateFunctio
e3e0: 6e 56 32 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65  nV2));.  p->inte
e3f0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20  rp = interp;..  
e400: 66 6f 72 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b  for(i=5; i<objc;
e410: 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20   i+=2){.    int 
e420: 69 53 77 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e  iSwitch;.    con
e430: 73 74 20 63 68 61 72 20 2a 61 7a 53 77 69 74 63  st char *azSwitc
e440: 68 5b 5d 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20  h[] = {"-func", 
e450: 22 2d 73 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c  "-step", "-final
e460: 22 2c 20 22 2d 64 65 73 74 72 6f 79 22 2c 20 30  ", "-destroy", 0
e470: 7d 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  };.    if( Tcl_G
e480: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
e490: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20  nterp, objv[i], 
e4a0: 61 7a 53 77 69 74 63 68 2c 20 22 73 77 69 74 63  azSwitch, "switc
e4b0: 68 22 2c 20 30 2c 20 26 69 53 77 69 74 63 68 29  h", 0, &iSwitch)
e4c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e4d0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
e4e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e4f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  R;.    }..    sw
e500: 69 74 63 68 28 20 69 53 77 69 74 63 68 20 29 7b  itch( iSwitch ){
e510: 0a 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 70  .      case 0: p
e520: 2d 3e 70 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69  ->pFunc = objv[i
e530: 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  +1];      break;
e540: 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 70  .      case 1: p
e550: 2d 3e 70 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69  ->pStep = objv[i
e560: 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  +1];      break;
e570: 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 70  .      case 2: p
e580: 2d 3e 70 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b  ->pFinal = objv[
e590: 69 2b 31 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b  i+1];     break;
e5a0: 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 70  .      case 3: p
e5b0: 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a  ->pDestroy = obj
e5c0: 76 5b 69 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b  v[i+1];   break;
e5d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e5e0: 20 70 2d 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70   p->pFunc ) p->p
e5f0: 46 75 6e 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69  Func = Tcl_Dupli
e600: 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63  cateObj(p->pFunc
e610: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74  ); .  if( p->pSt
e620: 65 70 20 29 20 70 2d 3e 70 53 74 65 70 20 3d 20  ep ) p->pStep = 
e630: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e640: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
e650: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70  f( p->pFinal ) p
e660: 2d 3e 70 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44  ->pFinal = Tcl_D
e670: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
e680: 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70  Final); .  if( p
e690: 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 70 2d 3e  ->pDestroy ) p->
e6a0: 70 44 65 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44  pDestroy = Tcl_D
e6b0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
e6c0: 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66  Destroy); ..  if
e6d0: 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c  ( p->pFunc ) Tcl
e6e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
e6f0: 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20  >pFunc); .  if( 
e700: 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f 49  p->pStep ) Tcl_I
e710: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
e720: 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d  Step); .  if( p-
e730: 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e  >pFinal ) Tcl_In
e740: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
e750: 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d  inal); .  if( p-
e760: 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c 5f  >pDestroy ) Tcl_
e770: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
e780: 70 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72  pDestroy); ..  r
e790: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e7a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64  te_function_v2(d
e7b0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
e7c0: 65 6e 63 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20  enc, (void *)p, 
e7d0: 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 75 6e 63  .      (p->pFunc
e7e0: 20 3f 20 63 66 32 46 75 6e 63 20 3a 20 30 29 2c   ? cf2Func : 0),
e7f0: 0a 20 20 20 20 20 20 28 70 2d 3e 70 53 74 65 70  .      (p->pStep
e800: 20 3f 20 63 66 32 53 74 65 70 20 3a 20 30 29 2c   ? cf2Step : 0),
e810: 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 69 6e 61  .      (p->pFina
e820: 6c 20 3f 20 63 66 32 46 69 6e 61 6c 20 3a 20 30  l ? cf2Final : 0
e830: 29 2c 0a 20 20 20 20 20 20 63 66 32 44 65 73 74  ),.      cf2Dest
e840: 72 6f 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  roy.  );.  if( r
e850: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e860: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
e870: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
e880: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e890: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
e8a0: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
e8b0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
e8c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e8d0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
e8e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
e8f0: 65 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f  e: sqlite3_load_
e900: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
e910: 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 0a  DLE FILE ?PROC?.
e920: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
e930: 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  st_load_extensio
e940: 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  n(.  ClientData 
e950: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
e960: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
e970: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e980: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
e990: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
e9a0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
e9b0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
e9c0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
e9d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e9e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
e9f0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
ea00: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
ea10: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
ea20: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
ea30: 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
ea40: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
ea50: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68   char *zDb;.  ch
ea60: 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61  ar *zFile;.  cha
ea70: 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20  r *zProc = 0;.  
ea80: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
ea90: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26  .  if( objc!=4 &
eaa0: 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
eab0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
eac0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
ead0: 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 46 49  v, "DB-HANDLE FI
eae0: 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20 20 20  LE ?PROC?");.   
eaf0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
eb00: 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54  R;.  }.  zDb = T
eb10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
eb20: 76 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  v[1]);.  zFile =
eb30: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
eb40: 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6f  bjv[2]);.  if( o
eb50: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 50  bjc==4 ){.    zP
eb60: 72 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  roc = Tcl_GetStr
eb70: 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
eb80: 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20  }..  /* Extract 
eb90: 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68  the C database h
eba0: 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54  andle from the T
ebb0: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  cl command name 
ebc0: 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65  */.  if( !Tcl_Ge
ebd0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
ebe0: 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e  erp, zDb, &cmdIn
ebf0: 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
ec00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ec10: 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74  rp, "command not
ec20: 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20   found: ", zDb, 
ec30: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
ec40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ec50: 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74  .  }.  db = ((st
ec60: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
ec70: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
ec80: 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73  Data)->db;.  ass
ec90: 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  ert(db);..  /* C
eca0: 61 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c 79 69  all the underlyi
ecb0: 6e 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ng C function. I
ecc0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
ecd0: 73 2c 20 73 65 74 20 72 63 20 74 6f 20 0a 20 20  s, set rc to .  
ece0: 2a 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64  ** TCL_ERROR and
ecf0: 20 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f 72 20   load any error 
ed00: 73 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  string into the 
ed10: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 49 66 20  interpreter. If 
ed20: 6e 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f  no .  ** error o
ed30: 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f  ccurs, set rc to
ed40: 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69   TCL_OK..  */.#i
ed50: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
ed60: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
ed70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
ed80: 52 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71  ROR;.  zErr = sq
ed90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74  lite3_mprintf("t
eda0: 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20  his build omits 
edb0: 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
edc0: 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65 6c 73  ension()");.#els
edd0: 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  e.  rc = sqlite3
ede0: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
edf0: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
ee00: 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66  , &zErr);.#endif
ee10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ee20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
ee30: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ee40: 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a 20  , zErr ? zErr : 
ee50: 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  "", TCL_VOLATILE
ee60: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
ee70: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
ee80: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
ee90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
eea0: 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65  ree(zErr);..  re
eeb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
eec0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
eed0: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
eee0: 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45  ension DB-HANDLE
eef0: 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63   ONOFF.*/.static
ef00: 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65   int test_enable
ef10: 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74 44  _load(.  ClientD
ef20: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
ef30: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
ef40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ef50: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
ef60: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
ef70: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
ef80: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
ef90: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
efa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
efb0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
efc0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
efd0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
efe0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
eff0: 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  ){.  Tcl_CmdInfo
f000: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69   cmdInfo;.  sqli
f010: 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
f020: 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66  *zDb;.  int onof
f030: 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  f;..  if( objc!=
f040: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
f050: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f060: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48  , 1, objv, "DB-H
f070: 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20  ANDLE ONOFF");. 
f080: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f090: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
f0a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f0b0: 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45  bjv[1]);..  /* E
f0c0: 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61 74  xtract the C dat
f0d0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f  abase handle fro
f0e0: 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e  m the Tcl comman
f0f0: 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20  d name */.  if( 
f100: 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  !Tcl_GetCommandI
f110: 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c  nfo(interp, zDb,
f120: 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20   &cmdInfo) ){.  
f130: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f140: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d  lt(interp, "comm
f150: 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22  and not found: "
f160: 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29  , zDb, (char*)0)
f170: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f180: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62  _ERROR;.  }.  db
f190: 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69   = ((struct Sqli
f1a0: 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
f1b0: 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62  jClientData)->db
f1c0: 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a  ;.  assert(db);.
f1d0: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e  .  /* Get the on
f1e0: 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  off parameter */
f1f0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
f200: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
f210: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
f220: 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74  noff) ){.    ret
f230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f240: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
f250: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
f260: 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65  NSION.  Tcl_Appe
f270: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f280: 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69   "this build omi
f290: 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f  ts sqlite3_load_
f2a0: 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20  extension()");. 
f2b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f2c0: 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74  R;.#else.  sqlit
f2d0: 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
f2e0: 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f  xtension(db, ono
f2f0: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ff);.  return TC
f300: 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  L_OK;.#endif.}..
f310: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
f320: 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a  lite_abort.**.**
f330: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72   Shutdown the pr
f340: 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c  ocess immediatel
f350: 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20  y.  This is not 
f360: 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e  a clean shutdown
f370: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  ..** This comman
f380: 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  d is used to tes
f390: 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62 69  t the recoverabi
f3a0: 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62 61  lity of a databa
f3b0: 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65  se in.** the eve
f3c0: 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20  nt of a program 
f3d0: 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  crash..*/.static
f3e0: 20 69 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72   int sqlite_abor
f3f0: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
f400: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
f410: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
f420: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
f430: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
f440: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
f450: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
f460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f470: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
f480: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
f490: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
f4a0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
f4b0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20  ument */.){.#if 
f4c0: 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52  defined(_MSC_VER
f4d0: 29 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69  ).  /* We do thi
f4e0: 73 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65  s, otherwise the
f4f0: 20 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20   test will halt 
f500: 77 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73  with a popup mes
f510: 73 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77  sage.   * that w
f520: 65 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20  e have to click 
f530: 61 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20  away before the 
f540: 74 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  test will contin
f550: 75 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74  ue..   */.  _set
f560: 5f 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28  _abort_behavior(
f570: 20 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54   0, _CALL_REPORT
f580: 46 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a  FAULT );.#endif.
f590: 20 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61    exit(255);.  a
f5a0: 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30  ssert( interp==0
f5b0: 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69   );   /* This wi
f5c0: 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a  ll always fail *
f5d0: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
f5e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
f5f0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
f600: 65 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69  e is a user-defi
f610: 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ned SQL function
f620: 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a   whose purpose.*
f630: 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65  * is to test the
f640: 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75   sqlite_set_resu
f650: 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  lt() API..*/.sta
f660: 74 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e  tic void testFun
f670: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
f680: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
f690: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
f6a0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77  lue **argv){.  w
f6b0: 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b  hile( argc>=2 ){
f6c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f6d0: 2a 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29  *zArg0 = (char*)
f6e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f6f0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  xt(argv[0]);.   
f700: 20 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20   if( zArg0 ){.  
f710: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
f720: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
f730: 20 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20   "int") ){.     
f740: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f750: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
f760: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
f770: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20  (argv[1]));.    
f780: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
f790: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
f7a0: 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a  ,"int64")==0 ){.
f7b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f7c0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
f7d0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
f7e0: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31  lue_int64(argv[1
f7f0: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
f800: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f810: 43 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e  Cmp(zArg0,"strin
f820: 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
f830: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f840: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
f850: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
f860: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
f870: 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ), -1,.         
f880: 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49     SQLITE_TRANSI
f890: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ENT);.      }els
f8a0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
f8b0: 49 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62  ICmp(zArg0,"doub
f8c0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
f8d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f8e0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
f8f0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
f900: 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29  double(argv[1]))
f910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f920: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f930: 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d  (zArg0,"null")==
f940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
f950: 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
f960: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
f970: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
f980: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
f990: 22 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20  "value")==0 ){. 
f9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
f9b0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
f9c0: 65 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65  ext, argv[sqlite
f9d0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
f9e0: 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65  [1])]);.      }e
f9f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  lse{.        got
fa00: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
fa10: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
fa20: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
fa30: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
fa40: 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61  argc -= 2;.    a
fa50: 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  rgv += 2;.  }.  
fa60: 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f  return;..error_o
fa70: 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ut:.  sqlite3_re
fa80: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
fa90: 78 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65  xt,"first argume
faa0: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  nt should be one
fab0: 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e   of: ".      "in
fac0: 74 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64  t int64 string d
fad0: 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65  ouble null value
fae0: 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ", -1);.}../*.**
faf0: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
fb00: 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66  _register_test_f
fb10: 75 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d  unction  DB  NAM
fb20: 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  E.**.** Register
fb30: 20 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75   the test SQL fu
fb40: 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61  nction on the da
fb50: 74 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20  tabase DB under 
fb60: 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a  the name NAME..*
fb70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
fb80: 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28  t_register_func(
fb90: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
fba0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
fbb0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
fbc0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
fbd0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
fbe0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
fbf0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
fc00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fc10: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
fc20: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
fc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
fc40: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
fc50: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
fc60: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
fc70: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  c;.  if( argc!=3
fc80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
fc90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fca0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
fcb0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
fcc0: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
fcd0: 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41  " DB FUNCTION-NA
fce0: 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ME", 0);.    ret
fcf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fd00: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
fd10: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
fd20: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
fd30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fd40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
fd50: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
fd60: 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20  b, argv[2], -1, 
fd70: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
fd80: 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c  .      testFunc,
fd90: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
fda0: 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=0 ){.    Tcl_A
fdb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fdc0: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  rp, sqlite3ErrSt
fdd0: 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  r(rc), 0);.    r
fde0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fdf0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
fe00: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
fe10: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
fe20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fe30: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
fe40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
fe50: 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  e:  sqlite3_fina
fe60: 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a  lize  STMT .**.*
fe70: 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61  * Finalize a sta
fe80: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a  tement handle..*
fe90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
fea0: 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f  t_finalize(.  vo
feb0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
fec0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
fed0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
fee0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
fef0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ff00: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
ff10: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
ff20: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30   sqlite3 *db = 0
ff30: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
ff40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ff50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ff60: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
ff70: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
ff80: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
ff90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
ffa0: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
ffb0: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
ffc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ffd0: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
ffe0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
fff0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10000 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
10010 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10020 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  OR;..  if( pStmt
10030 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d   ){.    db = Stm
10040 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20  tToDb(pStmt);.  
10050 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10060 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10070 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
10080 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
10090 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
100a0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
100b0 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69    if( db && sqli
100c0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
100d0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
100e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
100f0 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
10100 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
10110 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
10120 74 5f 73 74 61 74 75 73 20 20 53 54 4d 54 20 20  t_status  STMT  
10130 43 4f 44 45 20 20 52 45 53 45 54 46 4c 41 47 0a  CODE  RESETFLAG.
10140 2a 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 76 61  **.** Get the va
10150 6c 75 65 20 6f 66 20 61 20 73 74 61 74 75 73 20  lue of a status 
10160 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 61 20 73  counter from a s
10170 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
10180 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
10190 74 5f 73 74 61 74 75 73 28 0a 20 20 76 6f 69 64  t_status(.  void
101a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
101b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
101c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
101d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
101e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
101f0 74 20 69 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20  t iValue;.  int 
10200 69 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67  i, op, resetFlag
10210 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10220 7a 4f 70 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  zOpName;.  sqlit
10230 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10240 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
10250 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
10260 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
10270 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20      int op;.  } 
10280 61 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  aOp[] = {.    { 
10290 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  "SQLITE_STMTSTAT
102a0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
102b0 22 2c 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54  ",   SQLITE_STMT
102c0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
102d0 53 54 45 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20  STEP   },.    { 
102e0 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  "SQLITE_STMTSTAT
102f0 55 53 5f 53 4f 52 54 22 2c 20 20 20 20 20 20 20  US_SORT",       
10300 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54       SQLITE_STMT
10310 53 54 41 54 55 53 5f 53 4f 52 54 20 20 20 20 20  STATUS_SORT     
10320 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
10330 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  "SQLITE_STMTSTAT
10340 55 53 5f 41 55 54 4f 49 4e 44 45 58 22 2c 20 20  US_AUTOINDEX",  
10350 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54       SQLITE_STMT
10360 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
10370 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
10380 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
10390 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
103a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
103b0 6f 62 6a 76 2c 20 22 53 54 4d 54 20 50 41 52 41  objv, "STMT PARA
103c0 4d 45 54 45 52 20 52 45 53 45 54 46 4c 41 47 22  METER RESETFLAG"
103d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
103e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
103f0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
10400 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
10410 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10420 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
10430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10440 7a 4f 70 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zOpName = Tcl_Ge
10450 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
10460 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
10470 72 72 61 79 53 69 7a 65 28 61 4f 70 29 3b 20 69  rraySize(aOp); i
10480 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
10490 63 6d 70 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65  cmp(aOp[i].zName
104a0 2c 20 7a 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b  , zOpName)==0 ){
104b0 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b  .      op = aOp[
104c0 69 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 62 72 65  i].op;.      bre
104d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
104e0 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65  if( i>=ArraySize
104f0 28 61 4f 70 29 20 29 7b 0a 20 20 20 20 69 66 28  (aOp) ){.    if(
10500 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
10510 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10520 32 5d 2c 20 26 6f 70 29 20 29 20 72 65 74 75 72  2], &op) ) retur
10530 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10540 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
10550 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
10560 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72  erp, objv[3], &r
10570 65 73 65 74 46 6c 61 67 29 20 29 20 72 65 74 75  esetFlag) ) retu
10580 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10590 69 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  iValue = sqlite3
105a0 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
105b0 6d 74 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61  mt, op, resetFla
105c0 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  g);.  Tcl_SetObj
105d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
105e0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61  cl_NewIntObj(iVa
105f0 6c 75 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  lue));.  return 
10600 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10610 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10620 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20 20  _next_stmt  DB  
10630 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
10640 6e 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 6d  n the next statm
10650 65 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65 20  ent in sequence 
10660 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73  after STMT..*/.s
10670 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6e  tatic int test_n
10680 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64  ext_stmt(.  void
10690 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
106a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
106b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
106c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
106d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
106e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
106f0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
10700 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
10710 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  f[50];..  if( ob
10720 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
10730 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10740 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
10750 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
10760 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
10770 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10780 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
10790 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20  DB STMT", 0);.  
107a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
107b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
107c0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
107d0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
107e0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
107f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
10800 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
10810 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
10820 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10830 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
10840 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10850 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20  RROR;.  pStmt = 
10860 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d  sqlite3_next_stm
10870 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20  t(db, pStmt);.  
10880 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
10890 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
108a0 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
108b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
108c0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
108d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
108e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
108f0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
10900 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
10910 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
10920 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
10930 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54  t_readonly  STMT
10940 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
10950 75 65 20 69 66 20 53 54 4d 54 20 69 73 20 61 20  ue if STMT is a 
10960 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20  NULL pointer or 
10970 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
10980 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74  tatement.** that
10990 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
109a0 6f 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  o leave the data
109b0 62 61 73 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e  base unmodified.
109c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
109d0 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  est_stmt_readonl
109e0 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
109f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
10a00 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
10a10 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
10a20 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
10a30 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
10a40 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
10a50 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
10a60 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
10a70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10a80 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
10a90 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
10aa0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
10ab0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10ac0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
10ad0 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
10ae0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10af0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
10b00 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
10b10 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10b20 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
10b30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10b40 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
10b50 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
10b60 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ly(pStmt);.  Tcl
10b70 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
10b80 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
10b90 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20  leanObj(rc));.  
10ba0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10bb0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10bc0 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
10bd0 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  l  STMT.**.** Re
10be0 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d  turn true if STM
10bf0 54 20 75 73 65 73 20 61 20 73 74 61 74 65 6d 65  T uses a stateme
10c00 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
10c10 74 61 74 69 63 20 69 6e 74 20 75 73 65 73 5f 73  tatic int uses_s
10c20 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20 76  tmt_journal(.  v
10c30 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10c40 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10c50 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10c60 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10c70 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
10c80 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
10c90 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
10ca0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
10cb0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10cc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10cd0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10ce0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
10cf0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10d00 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
10d10 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20  ], 0), " STMT", 
10d20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10d30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
10d40 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
10d50 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10d60 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10d70 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
10d80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
10da0 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74  tmt_readonly(pSt
10db0 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  mt);.  Tcl_SetOb
10dc0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10dd0 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
10de0 6a 28 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74  j(((Vdbe *)pStmt
10df0 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  )->usesStmtJourn
10e00 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
10e10 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
10e20 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10e30 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a  _reset  STMT .**
10e40 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 74 61 74  .** Reset a stat
10e50 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f  ement handle..*/
10e60 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
10e70 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
10e80 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10e90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10ea0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10eb0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
10ec0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
10ed0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
10ee0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
10ef0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10f00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10f10 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10f20 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10f30 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10f40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10f50 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10f60 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
10f70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10f80 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
10f90 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
10fa0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10fb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10fc0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
10fd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
10fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
10ff0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
11000 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65   pStmt && sqlite
11010 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
11020 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
11030 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20  tmt), rc) ){.   
11040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11050 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
11060 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
11070 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
11080 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
11090 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63  IC);./*.  if( rc
110a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
110b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f  CL_ERROR;.  }.*/
110c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
110d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
110e0 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  :  sqlite3_expir
110f0 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  ed STMT .**.** R
11100 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
11110 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
11120 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
11130 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a  s recommended..*
11140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
11150 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69  t_expired(.  voi
11160 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
11170 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11180 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
11190 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
111a0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
111b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
111c0 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71  _DEPRECATED.  sq
111d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
111e0 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  t;.  if( objc!=2
111f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
11200 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11210 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
11220 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
11230 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
11240 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
11250 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
11260 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
11270 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11280 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
11290 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
112a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
112b0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
112c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
112d0 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
112e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
112f0 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
11300 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28  sqlite3_expired(
11310 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66  pStmt)));.#endif
11320 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
11330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
11340 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  :  sqlite3_trans
11350 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f  fer_bindings FRO
11360 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a  MSTMT TOSTMT.**.
11370 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20  ** Transfer all 
11380 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52  bindings from FR
11390 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54  OMSTMT over to T
113a0 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20  OSTMT.*/.static 
113b0 69 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65  int test_transfe
113c0 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a  r_bind(.  void *
113d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
113e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
113f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
11400 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
11410 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
11420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
11430 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74  PRECATED.  sqlit
11440 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c  e3_stmt *pStmt1,
11450 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20   *pStmt2;.  if( 
11460 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
11470 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11480 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
11490 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
114a0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
114b0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
114c0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
114d0 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53  " FROM-STMT TO-S
114e0 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
114f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11500 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
11510 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
11520 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11530 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31  bjv[1]), &pStmt1
11540 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
11550 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
11560 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
11570 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
11580 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
11590 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  2)) return TCL_E
115a0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
115b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
115c0 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e   .     Tcl_NewIn
115d0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61  tObj(sqlite3_tra
115e0 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70  nsfer_bindings(p
115f0 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b  Stmt1,pStmt2)));
11600 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
11610 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
11620 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
11630 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a  3_changes DB.**.
11640 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
11650 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
11660 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
11670 62 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74  base by the last
11680 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f   SQL.** executio
11690 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
116a0 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20   test_changes(. 
116b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
116c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
116d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
116e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
116f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11700 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
11710 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
11720 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11730 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
11740 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
11750 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
11760 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
11770 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
11780 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
11790 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
117a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
117b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
117c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
117d0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
117e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
117f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11800 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
11810 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61  tObj(sqlite3_cha
11820 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65  nges(db)));.  re
11830 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11840 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
11850 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  e "static_bind_v
11860 61 6c 75 65 22 20 74 68 61 74 20 76 61 72 69 61  alue" that varia
11870 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74  bles are bound t
11880 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c  o when.** the FL
11890 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c  AG option of sql
118a0 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74  ite3_bind is "st
118b0 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20  atic".*/.static 
118c0 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61  char *sqlite_sta
118d0 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d  tic_bind_value =
118e0 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73   0;.static int s
118f0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
11900 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a  d_nbyte = 0;../*
11910 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
11920 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44  te3_bind  VM  ID
11930 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a  X  VALUE  FLAGS.
11940 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76  **.** Sets the v
11950 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d  alue of the IDX-
11960 74 68 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20  th occurance of 
11970 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69  "?" in the origi
11980 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e  nal SQL.** strin
11990 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65  g.  VALUE is the
119a0 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20   new value.  If 
119b0 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68  FLAGS=="null" th
119c0 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69  en VALUE is.** i
119d0 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76  gnored and the v
119e0 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e  alue is set to N
119f0 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ULL.  If FLAGS==
11a00 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a  "static" then.**
11a10 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65   the value is se
11a20 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  t to the value o
11a30 66 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61  f a static varia
11a40 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71  ble named.** "sq
11a50 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
11a60 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41  _value".  If FLA
11a70 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65  GS=="normal" the
11a80 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74  n a copy.** of t
11a90 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65  he VALUE is made
11aa0 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c  .  If FLAGS=="bl
11ab0 6f 62 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c  ob10" then a VAL
11ac0 55 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a  UE is ignored.**
11ad0 20 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c   an a 10-byte bl
11ae0 6f 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30  ob "abc\000xyz\0
11af0 30 30 70 71 22 20 69 73 20 69 6e 73 65 72 74 65  00pq" is inserte
11b00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
11b10 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f   test_bind(.  vo
11b20 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
11b30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11b40 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
11b50 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
11b60 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
11b70 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
11b80 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
11b90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11ba0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
11bb0 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
11bc0 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
11bd0 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
11be0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
11bf0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
11c00 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
11c10 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
11c20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11c30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11c40 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
11c50 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
11c60 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
11c70 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75  VM IDX VALUE (nu
11c80 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c  ll|static|normal
11c90 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  )\"", 0);.    re
11ca0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11cb0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
11cc0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
11cd0 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74   argv[1], &pStmt
11ce0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11cf0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
11d00 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
11d10 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  rgv[2], &idx) ) 
11d20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11d30 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61  ;.  if( strcmp(a
11d40 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d  rgv[4],"null")==
11d50 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
11d60 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
11d70 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d  pStmt, idx);.  }
11d80 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11d90 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22  argv[4],"static"
11da0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
11db0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
11dc0 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73  xt(pStmt, idx, s
11dd0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
11de0 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b  d_value, -1, 0);
11df0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
11e00 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
11e10 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20  tic-nbytes")==0 
11e20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11e30 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
11e40 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
11e50 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
11e60 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11e90 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
11ea0 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  yte, 0);.  }else
11eb0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
11ec0 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30  [4],"normal")==0
11ed0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11ee0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
11ef0 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b  Stmt, idx, argv[
11f00 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  3], -1, SQLITE_T
11f10 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
11f20 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
11f30 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d  gv[4],"blob10")=
11f40 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
11f50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
11f60 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62  (pStmt, idx, "ab
11f70 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c  c\000xyz\000pq",
11f80 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   10, SQLITE_STAT
11f90 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
11fa0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11fb0 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20  lt(interp, "4th 
11fc0 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
11fd0 62 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  be ".        "\"
11fe0 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74  null\" or \"stat
11ff0 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c  ic\" or \"normal
12000 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
12010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12020 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
12030 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
12040 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
12050 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
12060 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
12070 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61  f( rc ){.    cha
12080 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
12090 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
120a0 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
120b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
120c0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
120d0 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
120e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
120f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12100 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12110 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12120 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
12130 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
12140 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20  est_collate <db 
12150 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  ptr> <utf8> <utf
12160 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a  16le> <utf16be>.
12170 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
12180 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
12190 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
121a0 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72  selects the corr
121b0 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  ect collation.**
121c0 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61   sequence callba
121d0 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
121e0 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
121f0 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
12200 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
12210 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
12220 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
12230 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
12240 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
12250 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c  quence "test_col
12260 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61  late".** with da
12270 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64  tabase handle <d
12280 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  b>. The second a
12290 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
122a0 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a  a list of three.
122b0 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  ** boolean value
122c0 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
122d0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  is true, then a 
122e0 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f  version of test_
122f0 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65  collate is.** re
12300 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
12310 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  -8, if the secon
12320 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72  d is true, a ver
12330 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  sion is register
12340 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36  ed for.** UTF-16
12350 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  le, if the third
12360 20 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d   is true, a UTF-
12370 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20  16be version is 
12380 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72  available..** Pr
12390 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
123a0 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
123b0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
123c0 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
123d0 20 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63   sequence test_c
123e0 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d  ollate is implem
123f0 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ented by calling
12400 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
12410 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
12420 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c  .**   "test_coll
12430 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20  ate <enc> <lhs> 
12440 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65  <rhs>".**.** The
12450 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e   <lhs> and <rhs>
12460 20 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c   are the two val
12470 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72  ues being compar
12480 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ed, encoded in U
12490 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e  TF-8..** The <en
124a0 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  c> parameter is 
124b0 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
124c0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
124d0 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53  nction that.** S
124e0 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74  QLite selected t
124f0 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20  o call. The TCL 
12500 74 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c  test script impl
12510 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74  ements the.** "t
12520 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f  est_collate" pro
12530 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  c..**.** Note th
12540 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c  at this will onl
12550 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20  y work with one 
12560 69 6e 74 65 70 72 65 74 65 72 20 61 74 20 61 20  intepreter at a 
12570 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20  time, as the.** 
12580 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74  interp pointer t
12590 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75  o use when evalu
125a0 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63  ating the TCL sc
125b0 72 69 70 74 20 69 73 20 73 74 6f 72 65 64 20 69  ript is stored i
125c0 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74  n.** pTestCollat
125d0 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74  eInterp..*/.stat
125e0 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70  ic Tcl_Interp* p
125f0 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
12600 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  p;.static int te
12610 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28  st_collate_func(
12620 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
12630 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20    int nA, const 
12640 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20  void *zA,.  int 
12650 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  nB, const void *
12660 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  zB.){.  Tcl_Inte
12670 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c  rp *i = pTestCol
12680 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e  lateInterp;.  in
12690 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54 45  t encin = SQLITE
126a0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74 78  _PTR_TO_INT(pCtx
126b0 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  );.  int res;.  
126c0 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65  int n;..  sqlite
126d0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
126e0 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20   Tcl_Obj *pX;.. 
126f0 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
12700 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c  ingObj("test_col
12710 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63  late", -1);.  Tc
12720 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
12730 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65  X);..  switch( e
12740 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65  ncin ){.    case
12750 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20   SQLITE_UTF8:.  
12760 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
12770 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
12780 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
12790 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b  bj("UTF-8",-1));
127a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
127b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
127c0 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16LE:.      Tcl
127d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
127e0 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
127f0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
12800 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16LE",-1));.   
12810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12820 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  se SQLITE_UTF16B
12830 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  E:.      Tcl_Lis
12840 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12850 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
12860 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42  ringObj("UTF-16B
12870 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62  E",-1));.      b
12880 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
12890 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
128a0 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  0);.  }..  sqlit
128b0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
128c0 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d 20  loc();.  pVal = 
128d0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
128e0 30 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29  0);.  if( pVal )
128f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
12900 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e  ueSetStr(pVal, n
12910 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51  A, zA, encin, SQ
12920 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
12930 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
12940 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b  lue_bytes(pVal);
12950 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
12960 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
12970 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  pX,.        Tcl_
12980 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
12990 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
129a0 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29  e_text(pVal),n))
129b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
129c0 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e  ueSetStr(pVal, n
129d0 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51  B, zB, encin, SQ
129e0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
129f0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
12a00 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b  lue_bytes(pVal);
12a10 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
12a20 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
12a30 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  pX,.        Tcl_
12a40 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
12a50 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
12a60 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29  e_text(pVal),n))
12a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
12a80 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
12a90 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
12aa0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
12ab0 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
12ac0 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
12ad0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
12ae0 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  ;.  Tcl_GetIntFr
12af0 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74  omObj(i, Tcl_Get
12b00 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72  ObjResult(i), &r
12b10 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  es);.  return re
12b20 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  s;.}.static int 
12b30 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20  test_collate(.  
12b40 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12b50 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12b60 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12b70 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12b80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12b90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
12ba0 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69   int val;.  sqli
12bb0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
12bc0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
12bd0 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f  ( objc!=5 ) goto
12be0 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65   bad_args;.  pTe
12bf0 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20  stCollateInterp 
12c00 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20  = interp;.  if( 
12c10 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
12c20 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
12c30 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
12c40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12c50 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c  RROR;..  if( TCL
12c60 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
12c70 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
12c80 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
12c90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12ca0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
12cb0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
12cc0 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
12cd0 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
12ce0 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
12cf0 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
12d00 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f  _UTF8, val?test_
12d10 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
12d20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
12d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
12d40 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a  t void *zUtf16;.
12d50 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
12d60 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
12d70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12d80 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
12d90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12da0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12db0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
12dc0 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c  on(db, "test_col
12dd0 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
12de0 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
12df0 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
12e00 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f  TE_UTF16LE, val?
12e10 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
12e20 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43  c:0);.    if( TC
12e30 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
12e40 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
12e50 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61  rp, objv[4], &va
12e60 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
12e70 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20  ERROR;..#if 0.  
12e80 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d    if( sqlite3_iM
12e90 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20  allocFail>0 ){. 
12ea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61       sqlite3_iMa
12eb0 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20  llocFail++;.    
12ec0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
12ed0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12ee0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
12ef0 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
12f00 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
12f10 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12f20 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74  Str(pVal, -1, "t
12f30 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
12f40 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
12f50 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a  E_STATIC);.    z
12f60 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56  Utf16 = sqlite3V
12f70 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
12f80 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
12f90 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
12fa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12fb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12fc0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
12fd0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
12fe0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
12ff0 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55  llation16(db, zU
13000 74 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46  tf16, SQLITE_UTF
13010 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16BE, .         
13020 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
13030 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73  UTF16BE, val?tes
13040 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
13050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
13060 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
13070 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
13080 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
13090 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69  >mutex);.  }.  i
130a0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
130b0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
130c0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
130d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69  CL_ERROR;.  .  i
130e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
130f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
13100 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13110 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
13120 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
13130 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13140 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
13150 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61  n TCL_OK;..bad_a
13160 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rgs:.  Tcl_Appen
13170 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13180 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
13190 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
131a0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
131b0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
131c0 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74  , 0), " <DB> <ut
131d0 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
131e0 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20  tf16be>", 0);.  
131f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
13210 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65  the collation ne
13220 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73  eded callback is
13230 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64   invoked, record
13240 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a   the name of .**
13250 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
13260 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
13270 6e 20 68 65 72 65 2e 20 20 54 68 65 20 72 65 63  n here.  The rec
13280 6f 72 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69  orded name is li
13290 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c  nked.** to a TCL
132a0 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73   variable and us
132b0 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
132c0 74 68 61 74 20 74 68 65 20 72 65 71 75 65 73 74  that the request
132d0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20  ed collation.** 
132e0 6e 61 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e  name is correct.
132f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
13300 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
13310 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68  [200];.static ch
13320 61 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c  ar *pzNeededColl
13330 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43  ation = zNeededC
13340 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a  ollation;.../*.*
13350 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  * Called when a 
13360 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
13370 63 65 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52  ce is needed.  R
13380 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a  egistered using.
13390 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  ** sqlite3_colla
133a0 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e  tion_needed16().
133b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
133c0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
133d0 64 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a  ded_cb(.  void *
133e0 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33  pCtx, .  sqlite3
133f0 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78   *db,.  int eTex
13400 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  tRep,.  const vo
13410 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69  id *pName.){.  i
13420 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  nt enc = ENC(db)
13430 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
13440 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20  r *z;.  for(z = 
13450 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d  (char*)pName, i=
13460 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a  0; *z || z[1]; z
13470 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20  ++){.    if( *z 
13480 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  ) zNeededCollati
13490 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20  on[i++] = *z;.  
134a0 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  }.  zNeededColla
134b0 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  tion[i] = 0;.  s
134c0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
134d0 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64  llation(.      d
134e0 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
134f0 22 2c 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49  ", ENC(db), SQLI
13500 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e  TE_INT_TO_PTR(en
13510 63 29 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  c), test_collate
13520 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _func);.}../*.**
13530 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
13540 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20  _collate_needed 
13550 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
13560 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
13570 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  eded(.  void * c
13580 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
13590 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
135a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
135b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
135c0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
135d0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
135e0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
135f0 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
13600 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
13610 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
13620 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
13630 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
13640 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
13650 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  c = sqlite3_coll
13660 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64  ation_needed16(d
13670 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  b, 0, test_colla
13680 74 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20  te_needed_cb);. 
13690 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
136a0 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  n[0] = 0;.  if( 
136b0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
136c0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
136d0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
136e0 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
136f0 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
13700 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  s:.  Tcl_WrongNu
13710 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
13720 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
13730 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
13750 64 3a 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65  d:   add_alignme
13760 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
13770 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64  ns  DB.**.** Add
13780 20 74 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69   two new collati
13790 6e 67 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20  ng sequences to 
137a0 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 0a  the database DB.
137b0 2a 2a 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f  **.**     utf16_
137c0 61 6c 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75  aligned.**     u
137d0 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a  tf16_unaligned.*
137e0 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74  *.** Both collat
137f0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
13800 65 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20  e the same sort 
13810 6f 72 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e  order as BINARY.
13820 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66  .** The only dif
13830 66 65 72 65 6e 63 65 20 69 73 20 74 68 61 74 20  ference is that 
13840 74 68 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65  the utf16_aligne
13850 64 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  d collating.** s
13860 65 71 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61  equence is decla
13870 72 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  red with the SQL
13880 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
13890 44 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20  D flag..** Both 
138a0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
138b0 6f 6e 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ons increment th
138c0 65 20 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31  e unaligned utf1
138d0 36 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65  6 counter.** whe
138e0 6e 65 76 65 72 20 74 68 65 79 20 73 65 65 20 61  never they see a
138f0 20 73 74 72 69 6e 67 20 74 68 61 74 20 62 65 67   string that beg
13900 69 6e 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79  ins on an odd by
13910 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
13920 73 74 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69  static int unali
13930 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
13940 74 65 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ter = 0;.static 
13950 69 6e 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c  int alignmentCol
13960 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  lFunc(.  void *N
13970 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
13980 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
13990 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
139a0 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
139b0 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
139c0 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65  rc, n;.  n = nKe
139d0 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31  y1<nKey2 ? nKey1
139e0 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20   : nKey2;.  if( 
139f0 6e 4b 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31  nKey1>0 && 1==(1
13a00 26 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  &(SQLITE_PTR_TO_
13a10 49 4e 54 28 70 4b 65 79 31 29 29 29 20 29 20 75  INT(pKey1))) ) u
13a20 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
13a30 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28  counter++;.  if(
13a40 20 6e 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28   nKey2>0 && 1==(
13a50 31 26 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  1&(SQLITE_PTR_TO
13a60 5f 49 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20  _INT(pKey2))) ) 
13a70 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
13a80 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63  _counter++;.  rc
13a90 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c   = memcmp(pKey1,
13aa0 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66   pKey2, n);.  if
13ab0 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
13ac0 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
13ad0 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
13ae0 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
13af0 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74   add_alignment_t
13b00 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a  est_collations(.
13b10 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
13b20 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
13b30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
13b40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
13b50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
13b60 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
13b70 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29  .  if( objc>=2 )
13b80 7b 0a 20 20 20 20 69 66 28 20 67 65 74 44 62 50  {.    if( getDbP
13b90 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
13ba0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13bb0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
13bc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13bd0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13be0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
13bf0 20 22 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65   "utf16_unaligne
13c00 64 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  d", SQLITE_UTF16
13c10 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c  , .        0, al
13c20 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29  ignmentCollFunc)
13c30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13c40 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
13c50 62 2c 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65  b, "utf16_aligne
13c60 64 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  d", SQLITE_UTF16
13c70 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20  _ALIGNED, .     
13c80 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43     0, alignmentC
13c90 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20  ollFunc);.  }.  
13ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13cb0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
13cc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13cd0 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a  IT_UTF16) */../*
13ce0 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
13cf0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62  est_function <db
13d00 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74   ptr> <utf8> <ut
13d10 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
13d20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
13d30 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
13d40 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
13d50 20 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72   selects the cor
13d60 72 65 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e  rect user.** fun
13d70 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77  ction callback w
13d80 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72  hen multiple ver
13d90 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65  sions (for diffe
13da0 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69  rent text encodi
13db0 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69  ngs).** are avai
13dc0 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c  lable..**.** Cal
13dd0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
13de0 65 20 72 65 67 69 73 74 65 72 73 20 75 70 20 74  e registers up t
13df0 6f 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73  o three versions
13e00 20 6f 66 20 74 68 65 20 75 73 65 72 20 66 75 6e   of the user fun
13e10 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66  ction.** "test_f
13e20 75 6e 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61  unction" with da
13e30 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64  tabase handle <d
13e40 62 3e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  b>.  If the seco
13e50 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a  nd argument is.*
13e60 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76  * true, then a v
13e70 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66  ersion of test_f
13e80 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73  unction is regis
13e90 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c  tered for UTF-8,
13ea0 20 69 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64   if the.** third
13eb0 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73   is true, a vers
13ec0 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65  ion is registere
13ed0 64 20 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20  d for UTF-16le, 
13ee0 69 66 20 74 68 65 20 66 6f 75 72 74 68 20 69 73  if the fourth is
13ef0 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d  .** true, a UTF-
13f00 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20  16be version is 
13f10 61 76 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76  available.  Prev
13f20 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
13f30 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  .** test_functio
13f40 6e 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a  n are deleted..*
13f50 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75  *.** The user fu
13f60 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
13f70 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ented by calling
13f80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54   the following T
13f90 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a  CL script:.**.**
13fa0 20 20 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f     "test_functio
13fb0 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a  n <enc> <arg>".*
13fc0 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e  *.** Where <enc>
13fd0 20 69 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38   is one of UTF-8
13fe0 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54  , UTF-16LE or UT
13ff0 46 31 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e  F16BE, and <arg>
14000 20 69 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c   is the.** singl
14010 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  e argument passe
14020 64 20 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e  d to the SQL fun
14030 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65  ction. The value
14040 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20   returned by.** 
14050 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  the TCL script i
14060 73 20 75 73 65 64 20 61 73 20 74 68 65 20 72 65  s used as the re
14070 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
14080 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  e SQL function. 
14090 49 74 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  It.** is passed 
140a0 74 6f 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20  to SQLite using 
140b0 55 54 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55  UTF-16BE for a U
140c0 54 46 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69  TF-8 test_functi
140d0 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66  on(), UTF-8.** f
140e0 6f 72 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65  or a UTF-16LE te
140f0 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  st_function(), a
14100 6e 64 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20  nd UTF-16LE for 
14110 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
14120 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72  n that.** prefer
14130 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23  s UTF-16BE..*/.#
14140 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14150 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
14160 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69  void test_functi
14170 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74  on_utf8(.  sqlit
14180 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
14190 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
141a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
141b0 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49  *argv.){.  Tcl_I
141c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
141d0 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20   Tcl_Obj *pX;.  
141e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
141f0 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  Val;.  interp = 
14200 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71  (Tcl_Interp *)sq
14210 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
14220 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63  pCtx);.  pX = Tc
14230 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
14240 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
14250 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
14260 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
14270 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
14280 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
14290 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pX, Tcl_NewStrin
142a0 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31  gObj("UTF-8", -1
142b0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
142c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
142d0 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
142e0 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
142f0 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
14300 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
14310 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
14320 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
14330 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
14340 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14350 70 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  pX);.  sqlite3_r
14360 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
14370 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
14380 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31  sult(interp), -1
14390 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
143a0 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  NT);.  pVal = sq
143b0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
143c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
143d0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
143e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
143f0 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
14400 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14410 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14420 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
14430 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78  lt_text16be(pCtx
14440 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
14450 74 65 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a  text16be(pVal),.
14460 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
14470 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
14480 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
14490 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pVal);.}.static 
144a0 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69  void test_functi
144b0 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71  on_utf16le(.  sq
144c0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
144d0 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
144e0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
144f0 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
14500 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14510 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
14520 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14530 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
14540 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
14550 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
14560 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
14570 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14580 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
14590 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
145a0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
145b0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
145c0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
145d0 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
145e0 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c  ringObj("UTF-16L
145f0 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  E", -1));.  Tcl_
14600 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14610 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
14620 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
14630 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
14640 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14650 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
14660 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
14670 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
14680 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
14690 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61  Count(pX);.  pVa
146a0 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
146b0 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
146c0 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
146d0 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
146e0 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
146f0 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
14700 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
14710 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
14720 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
14730 74 78 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65  tx,(char*)sqlite
14740 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
14750 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41  l),-1,SQLITE_TRA
14760 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
14770 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
14780 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
14790 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
147a0 74 66 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65  tf16be(.  sqlite
147b0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
147c0 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
147d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
147e0 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e  argv.){.  Tcl_In
147f0 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
14800 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73  Tcl_Obj *pX;.  s
14810 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
14820 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28  al;.  interp = (
14830 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c  Tcl_Interp *)sql
14840 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
14850 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c  Ctx);.  pX = Tcl
14860 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
14870 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d  est_function", -
14880 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
14890 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
148a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
148b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
148c0 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  X, Tcl_NewString
148d0 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20  Obj("UTF-16BE", 
148e0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
148f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14900 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20  (interp, pX, .  
14910 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
14920 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
14930 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
14940 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20  rgv[0]), -1));. 
14950 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
14960 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20  nterp, pX, 0);. 
14970 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
14980 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20  t(pX);.  pVal = 
14990 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
149a0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
149b0 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
149c0 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  1, Tcl_GetString
149d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
149e0 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
149f0 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
14a00 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  C);.  sqlite3_re
14a10 73 75 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78  sult_text16(pCtx
14a20 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
14a30 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
14a40 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
14a50 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
14a60 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
14a70 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c  xt16be(pCtx, sql
14a80 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
14a90 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6le(pVal),.     
14aa0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
14ab0 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
14ac0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c  3_result_text16l
14ad0 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
14ae0 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
14af0 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
14b00 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
14b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
14b20 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23  eFree(pVal);.}.#
14b30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14b40 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74  OMIT_UTF16 */.st
14b50 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75  atic int test_fu
14b60 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
14b70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
14b80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14b90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
14ba0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
14bb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
14bc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
14bd0 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
14be0 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20  b;.  int val;.. 
14bf0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67   if( objc!=5 ) g
14c00 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
14c10 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
14c20 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
14c30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
14c40 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
14c50 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
14c60 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
14c70 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
14c80 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
14c90 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
14ca0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
14cb0 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
14cc0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14cd0 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
14ce0 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
14cf0 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20  E_UTF8, .       
14d00 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75   interp, test_fu
14d10 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20  nction_utf8, 0, 
14d20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43  0);.  }.  if( TC
14d30 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
14d40 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
14d50 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
14d60 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
14d70 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c  ERROR;.  if( val
14d80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14d90 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
14da0 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69  db, "test_functi
14db0 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
14dc0 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20  TF16LE, .       
14dd0 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75   interp, test_fu
14de0 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20  nction_utf16le, 
14df0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
14e00 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
14e10 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
14e20 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
14e30 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
14e40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
14e50 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
14e60 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14e70 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
14e80 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
14e90 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20  E_UTF16BE, .    
14ea0 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
14eb0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62  _function_utf16b
14ec0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  e, 0, 0);.  }.. 
14ed0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
14ee0 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
14ef0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14f00 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
14f10 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
14f20 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ",.      Tcl_Get
14f30 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
14f40 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42  jv[0], 0), " <DB
14f50 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
14f60 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30  e> <utf16be>", 0
14f70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
14f80 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
14f90 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  /.  return TCL_E
14fa0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  RROR;.}../*.** U
14fb0 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 73 71  sage:         sq
14fc0 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74  lite3_test_errst
14fd0 72 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a  r <err code>.**.
14fe0 2a 2a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  ** Test that the
14ff0 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   english languag
15000 65 20 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c  e string equival
15010 65 6e 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20  ents for sqlite 
15020 65 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61  error codes.** a
15030 72 65 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72  re sane. The par
15040 61 6d 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74  ameter is an int
15050 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e  eger representin
15060 67 20 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f  g an sqlite erro
15070 72 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72  r code..** The r
15080 65 73 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20  esult is a list 
15090 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c  of two elements,
150a0 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
150b0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
150c0 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
150d0 61 6e 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20  and the english 
150e0 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
150f0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
15100 69 6e 74 20 74 65 73 74 5f 65 72 72 73 74 72 28  int test_errstr(
15110 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15120 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15130 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15140 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15150 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15160 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65  ){.  char *zCode
15170 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
15180 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
15190 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
151a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
151b0 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22  , "<error code>"
151c0 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20  );.  }..  zCode 
151d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
151e0 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28  objv[1]);.  for(
151f0 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29  i=0; i<200; i++)
15200 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72  {.    if( 0==str
15210 63 6d 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28  cmp(t1ErrorName(
15220 69 29 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65  i), zCode) ) bre
15230 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  ak;.  }.  Tcl_Se
15240 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
15250 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45  (char *)sqlite3E
15260 72 72 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20  rrStr(i), 0);.  
15270 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
15280 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
15290 20 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a    breakpoint.**.
152a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
152b0 65 78 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70  exists for one p
152c0 75 72 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76  urpose - to prov
152d0 69 64 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70  ide a place to p
152e0 75 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69  ut a.** breakpoi
152f0 6e 74 20 77 69 74 68 20 47 44 42 20 74 68 61 74  nt with GDB that
15300 20 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65   can be triggere
15310 64 20 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65  d using TCL code
15320 2e 20 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f  .  The use.** fo
15330 72 20 74 68 69 73 20 69 73 20 77 68 65 6e 20 61  r this is when a
15340 20 70 61 72 74 69 63 75 6c 61 72 20 74 65 73 74   particular test
15350 20 66 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20   fails on (say) 
15360 74 68 65 20 31 34 38 35 74 68 20 69 74 65 72 61  the 1485th itera
15370 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20  tion..** In the 
15380 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c  TCL test script,
15390 20 77 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65   we can add code
153a0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
153b0 2a 20 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34  *     if {$i==14
153c0 38 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a  85} breakpoint.*
153d0 2a 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65  *.** Then run te
153e0 73 74 66 69 78 74 75 72 65 20 69 6e 20 74 68 65  stfixture in the
153f0 20 64 65 62 75 67 67 65 72 20 61 6e 64 20 77 61   debugger and wa
15400 69 74 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b  it for the break
15410 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65  point to.** fire
15420 2e 20 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e  .  Then addition
15430 61 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63  al breakpoints c
15440 61 6e 20 62 65 20 73 65 74 20 74 6f 20 74 72 61  an be set to tra
15450 63 65 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e  ce down the bug.
15460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15470 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a  est_breakpoint(.
15480 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
15490 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
154a0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
154b0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
154c0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
154d0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
154e0 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
154f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15500 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
15510 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
15520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
15530 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
15540 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  nt */.){.  retur
15550 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20  n TCL_OK;       
15560 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
15570 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  */.}../*.** Usag
15580 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
15590 64 5f 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54  d_zeroblob  STMT
155a0 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73   IDX N.**.** Tes
155b0 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
155c0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65  nd_zeroblob inte
155d0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
155e0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
155f0 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20  ment..** IDX is 
15600 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
15610 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
15620 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15630 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
15640 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79  .** binds a N-by
15650 74 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42  te zero-filled B
15660 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
15670 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
15680 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72  nt test_bind_zer
15690 6f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  oblob(.  void * 
156a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
156b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
156c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
156d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
156e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
156f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
15700 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
15710 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   n;.  int rc;.. 
15720 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
15730 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15740 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
15750 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20  objv, "STMT IDX 
15760 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
15770 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
15780 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
15790 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
157a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
157b0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
157c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
157d0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
157e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
157f0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
15800 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15810 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
15820 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15830 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29  rp, objv[3], &n)
15840 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15850 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
15860 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
15870 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e  ob(pStmt, idx, n
15880 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
15890 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
158a0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
158b0 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
158c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
158d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
158e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
158f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
15900 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15910 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
15920 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
15930 6e 74 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  nt  STMT N VALUE
15940 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
15950 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15960 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
15970 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
15980 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
15990 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
159a0 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
159b0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
159c0 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
159d0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33  and.** binds a 3
159e0 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41  2-bit integer VA
159f0 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64  LUE to that wild
15a00 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
15a10 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e  int test_bind_in
15a20 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
15a30 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
15a40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
15a50 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
15a60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
15a70 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
15a80 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
15a90 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c  t idx;.  int val
15aa0 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
15ab0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
15ac0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15ad0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
15ae0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
15af0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
15b00 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
15b10 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
15b20 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
15b30 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
15b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15b50 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
15b60 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
15b70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15b80 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
15b90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15ba0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
15bb0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15bc0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
15bd0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
15be0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
15bf0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
15c00 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
15c10 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75  , &value) ) retu
15c20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
15c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
15c40 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64  nd_int(pStmt, id
15c50 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
15c60 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
15c70 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
15c80 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
15c90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15ca0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
15cb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15cc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15cd0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
15ce0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
15cf0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
15d00 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53  e3_bind_int64  S
15d10 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
15d20 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
15d30 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e  e3_bind_int64 in
15d40 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
15d50 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
15d60 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
15d70 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
15d80 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
15d90 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15da0 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
15db0 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62  .** binds a 64-b
15dc0 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
15dd0 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
15de0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15df0 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34   test_bind_int64
15e00 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15e10 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15e20 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15e30 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15e40 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15e50 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
15e60 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
15e70 20 69 64 78 3b 0a 20 20 69 36 34 20 76 61 6c 75   idx;.  i64 valu
15e80 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
15e90 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
15ea0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15eb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
15ec0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
15ed0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
15ee0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
15ef0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
15f00 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
15f10 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
15f20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15f30 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
15f40 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15f50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15f60 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15f70 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15f80 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15f90 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15fa0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
15fb0 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
15fc0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
15fd0 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
15fe0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15ff0 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72  [3], &value) ) r
16000 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16010 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
16020 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
16030 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
16040 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
16050 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
16060 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
16070 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
16080 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
160a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
160b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
160c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
160d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
160e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
160f0 62 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55  ble  STMT N VALU
16100 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  E.**.** Test the
16110 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
16120 75 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20  uble interface. 
16130 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
16140 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
16150 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
16160 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
16170 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16180 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16190 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
161a0 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
161b0 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
161c0 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
161d0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
161e0 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  d_double(.  void
161f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
16200 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16210 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
16220 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
16230 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
16240 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16250 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
16260 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
16270 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
16280 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e  char *zVal;.  in
16290 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
162a0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
162b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
162c0 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
162d0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 66  of the special f
162e0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
162f0 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  lue */.    unsig
16300 6e 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20  ned int iUpper; 
16310 20 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69    /* Upper 32 bi
16320 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ts */.    unsign
16330 65 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20  ed int iLower;  
16340 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74   /* Lower 32 bit
16350 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61  s */.  } aSpecia
16360 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  lFp[] = {.    { 
16370 20 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37   "NaN",      0x7
16380 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
16390 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53  fff },.    {  "S
163a0 4e 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37  NaN",     0x7ff7
163b0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
163c0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e   },.    {  "-NaN
163d0 22 2c 20 20 20 20 20 30 78 66 66 66 66 66 66 66  ",     0xfffffff
163e0 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
163f0 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c  .    {  "-SNaN",
16400 20 20 20 20 30 78 66 66 66 37 66 66 66 66 2c 20      0xfff7ffff, 
16410 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
16420 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20    {  "+Inf",    
16430 20 30 78 37 66 66 30 30 30 30 30 2c 20 30 78 30   0x7ff00000, 0x0
16440 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  0000000 },.    {
16450 20 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78    "-Inf",     0x
16460 66 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30  fff00000, 0x0000
16470 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
16480 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30  Epsilon",  0x000
16490 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
164a0 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70  1 },.    {  "-Ep
164b0 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30  silon", 0x800000
164c0 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d  00, 0x00000001 }
164d0 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c  ,.    {  "NaN0",
164e0 20 20 20 20 20 30 78 37 66 66 38 30 30 30 30 2c       0x7ff80000,
164f0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
16500 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20     {  "-NaN0",  
16510 20 20 30 78 66 66 66 38 30 30 30 30 2c 20 30 78    0xfff80000, 0x
16520 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b  00000000 },.  };
16530 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
16540 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16550 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16560 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16570 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
16580 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16590 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
165a0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
165b0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
165c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
165d0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
165e0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
165f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
16600 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
16610 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
16620 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
16630 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16640 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
16650 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
16660 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f   TCL_ERROR;..  /
16670 2a 20 49 6e 74 65 72 63 65 70 74 20 74 68 65 20  * Intercept the 
16680 73 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64  string "NaN" and
16690 20 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20   generate a NaN 
166a0 76 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20  value for it..  
166b0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72  ** All other str
166c0 69 6e 67 73 20 61 72 65 20 70 61 73 73 65 64 20  ings are passed 
166d0 74 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47  through to Tcl_G
166e0 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
166f0 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44  )..  ** Tcl_GetD
16700 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73  oubleFromObj() s
16710 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64  hould understand
16720 20 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20   "NaN" but some 
16730 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f  versions.  ** co
16740 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a  ntain a bug..  *
16750 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47  /.  zVal = Tcl_G
16760 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
16770 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
16780 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
16790 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69  p)/sizeof(aSpeci
167a0 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  alFp[0]); i++){.
167b0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
167c0 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61  SpecialFp[i].zNa
167d0 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a  me, zVal)==0 ){.
167e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69        sqlite3_ui
167f0 6e 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20  nt64 x;.      x 
16800 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  = aSpecialFp[i].
16810 69 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20  iUpper;.      x 
16820 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20  <<= 32;.      x 
16830 7c 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d  |= aSpecialFp[i]
16840 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61  .iLower;.      a
16850 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61  ssert( sizeof(va
16860 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  lue)==8 );.     
16870 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16880 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d  x)==8 );.      m
16890 65 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78  emcpy(&value, &x
168a0 2c 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 8);.      brea
168b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
168c0 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70  f( i>=sizeof(aSp
168d0 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
168e0 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26  aSpecialFp[0]) &
168f0 26 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  &.         Tcl_G
16900 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
16910 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16920 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   &value) ){.    
16930 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16940 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
16950 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
16960 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
16970 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
16980 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
16990 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
169a0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
169b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
169c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
169d0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
169e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
169f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
16a10 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
16a20 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a  _null  STMT N.**
16a30 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
16a40 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69  ite3_bind_null i
16a50 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
16a60 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
16a70 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
16a80 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
16a90 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
16aa0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16ab0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
16ac0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c  d.** binds a NUL
16ad0 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  L to the wildcar
16ae0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16af0 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28   test_bind_null(
16b00 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
16b10 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
16b20 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
16b30 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
16b40 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
16b50 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
16b60 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
16b70 69 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  idx;.  int rc;..
16b80 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
16b90 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16ba0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
16bb0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
16bc0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
16bd0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
16be0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
16bf0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c  , 0), " STMT N",
16c00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16c10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16c20 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
16c30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16c40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16c50 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
16c60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16c70 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
16c80 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16c90 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
16ca0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16cb0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
16cc0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
16cd0 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28  tmt, idx);.  if(
16ce0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
16cf0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
16d00 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
16d10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16d20 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
16d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16d40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16d50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16d60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16d70 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16d80 33 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d  3_bind_text  STM
16d90 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53  T N STRING BYTES
16da0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
16db0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
16dc0 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  t interface.  ST
16dd0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
16de0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
16df0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
16e00 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
16e10 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16e20 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
16e30 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
16e40 55 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52  UTF-8 string STR
16e50 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
16e60 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
16e70 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
16e80 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
16e90 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16ea0 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20  _text(.  void * 
16eb0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16ec0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16ed0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16ee0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16ef0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16f00 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16f10 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16f20 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
16f30 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16f40 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
16f50 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16f60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16f70 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16f80 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
16f90 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16fa0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
16fb0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
16fc0 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
16fd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16fe0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16ff0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17000 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17010 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17020 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17030 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17040 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17050 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17060 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
17070 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17080 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61  ;.  value = (cha
17090 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
170a0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
170b0 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20 20 69  3], &bytes);.  i
170c0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
170d0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
170e0 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[4], &bytes) ) 
170f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17100 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
17110 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
17120 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62  t, idx, value, b
17130 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41  ytes, SQLITE_TRA
17140 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73  NSIENT);.  if( s
17150 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
17160 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
17170 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
17180 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17190 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
171a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
171b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
171c0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65  nterp, sqlite3Te
171d0 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
171e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
171f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17200 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17220 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
17230 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f  text16 ?-static?
17240 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
17250 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17260 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17270 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61 63  _text16 interfac
17280 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
17290 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
172a0 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
172b0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
172c0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
172d0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
172e0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
172f0 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74 72  nds a UTF-16 str
17300 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68  ing STRING to th
17310 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
17320 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53   string is BYTES
17330 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a   bytes.** long..
17340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17350 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a  st_bind_text16(.
17360 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17370 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17380 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17390 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
173a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
173b0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
173c0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
173d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
173e0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
173f0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
17400 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
17410 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44  rc;..  void (*xD
17420 65 6c 29 28 29 20 3d 20 28 6f 62 6a 63 3d 3d 36  el)() = (objc==6
17430 3f 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53  ?SQLITE_STATIC:S
17440 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
17450 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74  ;.  Tcl_Obj *oSt
17460 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a  mt    = objv[obj
17470 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  c-4];.  Tcl_Obj 
17480 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76  *oN       = objv
17490 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f  [objc-3];.  Tcl_
174a0 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20  Obj *oString  = 
174b0 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20  objv[objc-2];.  
174c0 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20  Tcl_Obj *oBytes 
174d0 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d    = objv[objc-1]
174e0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
174f0 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20   && objc!=6){.  
17500 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17510 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
17520 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
17530 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
17540 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
17550 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
17560 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
17570 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  E BYTES", 0);.  
17580 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17590 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
175a0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
175b0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
175c0 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74  ing(oStmt), &pSt
175d0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
175e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
175f0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
17600 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78  interp, oN, &idx
17610 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17620 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
17630 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
17640 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
17650 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66  String, 0);.  if
17660 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17670 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74  Obj(interp, oByt
17680 65 73 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  es, &bytes) ) re
17690 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
176a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
176b0 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d  bind_text16(pStm
176c0 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29  t, idx, (void *)
176d0 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44  value, bytes, xD
176e0 65 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  el);.  if( sqlit
176f0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
17700 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
17710 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
17720 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17740 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
17750 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17760 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  p, sqlite3TestEr
17770 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
17780 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17790 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64  ERROR;.  }..#end
177a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
177b0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
177c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
177d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
177e0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
177f0 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
17800 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a   DATA BYTES.**.*
17810 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
17820 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74  e3_bind_blob int
17830 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
17840 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
17850 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
17860 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
17870 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
17880 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17890 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
178a0 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20  ** binds a BLOB 
178b0 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
178c0 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59    The BLOB is BY
178d0 54 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a  TES bytes in siz
178e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
178f0 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28   test_bind_blob(
17900 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
17910 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
17920 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
17930 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
17940 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
17950 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
17960 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
17970 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  idx;.  int bytes
17980 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b  ;.  char *value;
17990 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
179a0 69 74 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f  ite3_destructor_
179b0 74 79 70 65 20 78 44 65 73 74 72 75 63 74 6f 72  type xDestructor
179c0 20 3d 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49   = SQLITE_TRANSI
179d0 45 4e 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ENT;..  if( objc
179e0 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29  !=5 && objc!=6 )
179f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
17a00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17a10 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
17a20 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
17a30 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17a40 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
17a50 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
17a60 44 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b  DATA BYTES", 0);
17a70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17a80 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
17a90 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20  ( objc==6 ){.   
17aa0 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53   xDestructor = S
17ab0 51 4c 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20  QLITE_STATIC;.  
17ac0 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20    objv++;.  }.. 
17ad0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
17ae0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17af0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17b00 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
17b10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17b20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
17b30 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17b40 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
17b50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17b60 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c  R;.  value = Tcl
17b70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17b80 33 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  3]);.  if( Tcl_G
17b90 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
17ba0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62  erp, objv[4], &b
17bb0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
17bc0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
17bd0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62  = sqlite3_bind_b
17be0 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  lob(pStmt, idx, 
17bf0 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44  value, bytes, xD
17c00 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66  estructor);.  if
17c10 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
17c20 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
17c30 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
17c40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17c50 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
17c60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17c70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17c80 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
17c90 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17ca0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17cb0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
17cc0 72 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a  r_count  STMT.**
17cd0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
17ce0 75 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72  umber of wildcar
17cf0 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  ds in the given 
17d00 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
17d10 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
17d20 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
17d30 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
17d40 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17d50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17d60 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17d70 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17d80 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
17d90 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
17da0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
17db0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
17dc0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
17dd0 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
17de0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17df0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
17e00 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
17e10 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17e20 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
17e30 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
17e40 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
17e50 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
17e60 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
17e70 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  j(sqlite3_bind_p
17e80 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
17e90 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
17ea0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
17eb0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
17ec0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
17ed0 65 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e  er_name  STMT  N
17ee0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
17ef0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74  e name of the Nt
17f00 68 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  h wildcard.  The
17f10 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20   first wildcard 
17f20 69 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74  is 1..** An empt
17f30 79 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  y string is retu
17f40 72 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74  rned if N is out
17f50 20 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20   of range or if 
17f60 74 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  the wildcard.** 
17f70 69 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a  is nameless..*/.
17f80 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17f90 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
17fa0 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ame(.  void * cl
17fb0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
17fc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
17fd0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
17fe0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
17ff0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18000 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
18010 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62  int i;..  if( ob
18020 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
18030 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
18040 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
18050 53 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65  STMT N");.    re
18060 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18070 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
18080 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
18090 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
180a0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
180b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
180c0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
180d0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
180e0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
180f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18100 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
18110 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
18120 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74   .     Tcl_NewSt
18130 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
18140 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
18150 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29  ame(pStmt,i),-1)
18160 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
18170 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
18180 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
18190 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
181a0 69 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d  index  STMT  NAM
181b0 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
181c0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
181d0 77 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20  wildcard called 
181e0 4e 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20  NAME.  Return 0 
181f0 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
18200 6f 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e  o such wildcard.
18210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18220 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
18230 65 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64  er_index(.  void
18240 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18250 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18260 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18270 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18280 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18290 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
182a0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
182b0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
182c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
182d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
182e0 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74   NAME");.    ret
182f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18300 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
18310 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18320 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18330 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18340 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18350 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
18360 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
18370 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
18380 62 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74  bj(.       sqlit
18390 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
183a0 72 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63  r_index(pStmt,Tc
183b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
183c0 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29  [2])).     ).  )
183d0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
183e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
183f0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65  e:   sqlite3_cle
18400 61 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54  ar_bindings STMT
18410 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
18420 74 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e  t test_clear_bin
18430 64 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20  dings(.  void * 
18440 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18450 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18460 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18470 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18480 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18490 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
184a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
184b0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
184c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
184d0 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
184e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
184f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
18500 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
18510 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18520 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18530 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
18540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
18550 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18560 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
18570 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65  tObj(sqlite3_cle
18580 61 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d  ar_bindings(pStm
18590 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
185a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
185b0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
185c0 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f  _sleep MILLISECO
185d0 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NDS.*/.static in
185e0 74 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20  t test_sleep(.  
185f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18600 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18610 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18620 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18630 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18640 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28    int ms;..  if(
18650 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18660 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
18670 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
18680 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  , "MILLISECONDS"
18690 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
186a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
186b0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
186c0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
186d0 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20  v[1], &ms) ){.  
186e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
186f0 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  OR;.  }.  Tcl_Se
18700 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
18710 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
18720 28 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d  (sqlite3_sleep(m
18730 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  s)));.  return T
18740 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
18750 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
18760 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20  xtended_errcode 
18770 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
18780 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
18790 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
187a0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
187b0 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72  ite3_* API.** er
187c0 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22  ror code. e.g. "
187d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a  SQLITE_ERROR"..*
187e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
187f0 74 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20  t_ex_errcode(.  
18800 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18810 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18820 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18830 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18840 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18850 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18860 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
18870 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
18880 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18890 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
188a0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
188b0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
188c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
188d0 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
188e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
188f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
18900 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
18910 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
18920 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
18930 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
18940 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
18950 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
18960 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63  rrcode(db);.  Tc
18970 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18980 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
18990 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
189a0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
189b0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
189c0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72  sage: sqlite3_er
189d0 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
189e0 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
189f0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
18a00 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
18a10 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
18a20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
18a30 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
18a40 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
18a50 6e 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28  nt test_errcode(
18a60 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18a70 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18a80 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18a90 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18aa0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18ab0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
18ac0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
18ad0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
18ae0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18af0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18b00 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18b10 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
18b20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18b30 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
18b40 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
18b50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
18b60 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
18b70 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
18b80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18b90 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
18ba0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
18bb0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
18bc0 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  (db);.  Tcl_Appe
18bd0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18be0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
18bf0 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
18c00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18c10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
18c20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20   sqlite3_errmsg 
18c30 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
18c40 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65   the UTF-8 repre
18c50 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
18c60 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
18c70 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
18c80 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
18c90 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
18ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18cb0 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f  est_errmsg(.  vo
18cc0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18cd0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18ce0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
18cf0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
18d00 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
18d10 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
18d20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
18d30 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
18d40 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
18d50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18d60 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
18d70 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
18d80 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
18d90 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
18da0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
18db0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18dc0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
18dd0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18de0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18df0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
18e00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
18e10 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
18e20 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54  _errmsg(db);.  T
18e30 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
18e40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
18e50 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d  tringObj(zErr, -
18e60 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
18e70 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18e80 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72  sage:   test_err
18e90 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52  msg16 DB.**.** R
18ea0 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31  eturns the UTF-1
18eb0 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  6 representation
18ec0 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
18ed0 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
18ee0 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
18ef0 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
18f00 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20  I call. This is 
18f10 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a  a byte array obj
18f20 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a  ect at the TCL .
18f30 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74  ** level, and it
18f40 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78   includes the 0x
18f50 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  00 0x00 terminat
18f60 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20  or bytes at the 
18f70 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54  end of the.** UT
18f80 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  F-16 string..*/.
18f90 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18fa0 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64  errmsg16(.  void
18fb0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18fc0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18fd0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18fe0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18ff0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
19000 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19010 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
19020 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
19030 64 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74  d *zErr;.  const
19040 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
19050 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66  bytes = 0;..  if
19060 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
19070 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19080 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19090 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
190a0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
190b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
190c0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
190d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
190e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
190f0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
19100 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19110 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19120 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
19130 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72  L_ERROR;..  zErr
19140 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   = sqlite3_errms
19150 67 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a  g16(db);.  if( z
19160 45 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a  Err ){.    z = z
19170 45 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74  Err;.    for(byt
19180 65 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c  es=0; z[bytes] |
19190 7c 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79  | z[bytes+1]; by
191a0 74 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20  tes+=2){}.  }.  
191b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
191c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
191d0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72  ByteArrayObj(zEr
191e0 72 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64  r, bytes));.#end
191f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
19200 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
19210 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19220 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
19230 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73  te3_prepare DB s
19240 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
19250 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  r?.**.** Compile
19260 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
19270 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
19280 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
19290 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
192a0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
192b0 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
192c0 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
192d0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
192e0 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
192f0 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
19300 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
19310 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
19320 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
19330 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
19340 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
19350 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a  t test_prepare(.
19360 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19370 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19380 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19390 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
193a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
193b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
193c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
193d0 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
193e0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
193f0 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
19400 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19410 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
19420 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
19430 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
19440 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
19450 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19460 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
19470 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
19480 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
19490 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
194a0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
194b0 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
194c0 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
194d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
194e0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
194f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19500 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19510 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
19520 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19530 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
19540 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
19550 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
19560 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19570 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
19580 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19590 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
195a0 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
195b0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
195c0 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
195d0 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63  zTail : 0);.  Tc
195e0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
195f0 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c  terp);.  if( sql
19600 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
19610 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
19620 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19630 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20  OR;.  if( zTail 
19640 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  && objc>=5 ){.  
19650 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
19660 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
19670 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a  bytes - (zTail-z
19680 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
19690 69 66 28 20 73 74 72 6c 65 6e 28 7a 54 61 69 6c  if( strlen(zTail
196a0 29 3c 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20  )<bytes ){.     
196b0 20 62 79 74 65 73 20 3d 20 73 74 72 6c 65 6e 28   bytes = strlen(
196c0 7a 54 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zTail);.    }.  
196d0 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
196e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
196f0 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  , 0, Tcl_NewStri
19700 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74  ngObj(zTail, byt
19710 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  es), 0);.  }.  i
19720 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19730 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19740 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
19750 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
19760 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
19770 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19780 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
19790 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
197a0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
197b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
197c0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
197d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
197e0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
197f0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
19800 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
19810 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
19820 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19830 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
19840 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19850 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19860 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
19870 70 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71  prepare_v2 DB sq
19880 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
19890 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
198a0 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
198b0 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
198c0 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
198d0 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
198e0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
198f0 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
19900 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
19910 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
19920 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
19930 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
19940 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
19950 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
19960 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
19970 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
19980 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
19990 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32   test_prepare_v2
199a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
199b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
199c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
199d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
199e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
199f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
19a00 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
19a10 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74  *zSql;.  int byt
19a20 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  es;.  const char
19a30 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *zTail = 0;.  s
19a40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19a50 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
19a60 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72  Buf[50];.  int r
19a70 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
19a80 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  5 && objc!=4 ){.
19a90 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19aa0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19ab0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19ac0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
19ad0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
19ae0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
19af0 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
19b00 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
19b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19b20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
19b30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19b40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19b50 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
19b60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19b70 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
19b80 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
19b90 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
19ba0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19bb0 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
19bc0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19bd0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
19be0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
19bf0 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
19c00 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
19c10 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
19c20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
19c30 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d  TE_OK || pStmt==
19c40 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  0);.  Tcl_ResetR
19c50 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
19c60 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
19c70 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
19c80 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
19c90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19ca0 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e  ( zTail && objc>
19cb0 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79  =5 ){.    if( by
19cc0 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes>=0 ){.      
19cd0 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20  bytes = bytes - 
19ce0 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20  (zTail-zSql);.  
19cf0 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53    }.    Tcl_ObjS
19d00 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
19d10 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e  bjv[4], 0, Tcl_N
19d20 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69  ewStringObj(zTai
19d30 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20  l, bytes), 0);. 
19d40 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
19d50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
19d60 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
19d70 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
19d80 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
19d90 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19da0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19db0 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
19dc0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
19dd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19de0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
19df0 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
19e00 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
19e10 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
19e20 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
19e30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19e40 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19e50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19e60 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
19e70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19e80 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
19e90 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b  lite3_prepare_tk
19ea0 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47  t3134 DB.**.** G
19eb0 65 6e 65 72 61 74 65 20 61 20 70 72 65 70 61 72  enerate a prepar
19ec0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  ed statement for
19ed0 20 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72   a zero-byte str
19ee0 69 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a  ing as a test.**
19ef0 20 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33   for ticket #313
19f00 34 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 73  4.  The string s
19f10 68 6f 75 6c 64 20 62 65 20 70 72 65 63 65 65 64  hould be preceed
19f20 65 64 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74  ed by a zero byt
19f30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19f40 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b   test_prepare_tk
19f50 74 33 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20  t3134(.  void * 
19f60 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19f70 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19f80 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19f90 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19fa0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19fb0 65 33 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63  e3 *db;.  static
19fc0 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c   const char zSql
19fd0 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54  [] = "\000SELECT
19fe0 20 31 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   1";.  sqlite3_s
19ff0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1a000 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
1a010 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1a020 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1a030 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a040 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a050 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a060 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1a070 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a080 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
1a090 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
1a0a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a0b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a0c0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a0d0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a0e0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a0f0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1a100 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1a110 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1a120 65 5f 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31  e_v2(db, &zSql[1
1a130 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29  ], 0, &pStmt, 0)
1a140 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53  ;.  assert(rc==S
1a150 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
1a160 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t==0);.  if( sql
1a170 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1a180 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1a190 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a1a0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
1a1b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1a1c0 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
1a1d0 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
1a1e0 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
1a1f0 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
1a200 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a210 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
1a220 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
1a230 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a240 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
1a250 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1a260 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1a270 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1a280 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1a290 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a2a0 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
1a2b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a2c0 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
1a2d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a2e0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1a2f0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
1a300 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
1a310 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  ilvar.**.** Comp
1a320 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
1a330 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
1a340 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
1a350 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
1a360 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1a370 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
1a380 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
1a390 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
1a3a0 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
1a3b0 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
1a3c0 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
1a3d0 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
1a3e0 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
1a3f0 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
1a400 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1a410 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
1a420 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
1a430 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a440 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a450 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1a460 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1a470 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1a480 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1a490 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1a4a0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
1a4b0 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ql;.  const void
1a4c0 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54   *zTail = 0;.  T
1a4d0 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20  cl_Obj *pTail = 
1a4e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
1a4f0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1a500 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a  char zBuf[50]; .
1a510 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1a520 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20  bytes;          
1a530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
1a540 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61  eger specified a
1a550 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74  s arg 3 */.  int
1a560 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20   objlen;        
1a570 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
1a580 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20  te-array length 
1a590 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69  of arg 2 */..  i
1a5a0 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1a5b0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
1a5c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a5d0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1a5e0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a5f0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1a600 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1a610 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
1a620 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30  es ?tailvar?", 0
1a630 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a640 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1a650 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1a660 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1a670 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1a680 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1a690 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
1a6a0 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
1a6b0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
1a6c0 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69  ], &objlen);.  i
1a6d0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1a6e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1a6f0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
1a700 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a710 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1a720 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c 20  3_prepare16(db, 
1a730 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1a740 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1a750 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66  zTail : 0);.  if
1a760 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1a770 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1a780 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1a790 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1a7a0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1a7b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a7c0 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b    if( objc>=5 ){
1a7d0 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29  .    if( zTail )
1a7e0 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1a7f0 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a   objlen - ((u8 *
1a800 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71  )zTail-(u8 *)zSq
1a810 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
1a820 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b       objlen = 0;
1a830 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c  .    }.    pTail
1a840 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
1a850 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61  rayObj((u8 *)zTa
1a860 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20  il, objlen);.   
1a870 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
1a880 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63  t(pTail);.    Tc
1a890 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
1a8a0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
1a8b0 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20   pTail, 0);.    
1a8c0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1a8d0 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20  (pTail);.  }..  
1a8e0 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1a8f0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a900 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1a910 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1a920 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1a930 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
1a940 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a950 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1a960 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1a970 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1a980 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1a9a0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1a9b0 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74  16_v2 DB sql byt
1a9c0 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a  es ?tailvar?.**.
1a9d0 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
1a9e0 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
1a9f0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
1aa00 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
1aa10 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
1aa20 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
1aa30 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
1aa40 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
1aa50 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
1aa60 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
1aa70 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
1aa80 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
1aa90 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
1aaa0 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
1aab0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1aac0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1aad0 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20  _prepare16_v2(. 
1aae0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1aaf0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ab00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ab10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1ab20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1ab30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ab40 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
1ab50 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1ab60 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20  t void *zSql;.  
1ab70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69  const void *zTai
1ab80 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a  l = 0;.  Tcl_Obj
1ab90 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *pTail = 0;.  s
1aba0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1abb0 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
1abc0 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20  Buf[50]; .  int 
1abd0 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  rc;.  int bytes;
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73  /* The integer s
1ac00 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20  pecified as arg 
1ac10 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65  3 */.  int objle
1ac20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1ac30 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72   /* The byte-arr
1ac40 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67  ay length of arg
1ac50 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a   2 */..  if( obj
1ac60 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
1ac70 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ac80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ac90 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1aca0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1acb0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1acc0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1acd0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
1ace0 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20  ilvar?", 0);.   
1acf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ad00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1ad10 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1ad20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1ad30 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1ad40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ad50 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
1ad60 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1ad70 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62  Obj(objv[2], &ob
1ad80 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c  jlen);.  if( Tcl
1ad90 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1ada0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
1adb0 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
1adc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
1add0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1ade0 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71  are16_v2(db, zSq
1adf0 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
1ae00 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
1ae10 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73  il : 0);.  if( s
1ae20 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1ae30 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1ae40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1ae50 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
1ae60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1ae70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1ae80 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  f( objc>=5 ){.  
1ae90 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
1aea0 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62       objlen = ob
1aeb0 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54  jlen - ((u8 *)zT
1aec0 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b  ail-(u8 *)zSql);
1aed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1aee0 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
1aef0 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20    }.    pTail = 
1af00 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1af10 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c  Obj((u8 *)zTail,
1af20 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63   objlen);.    Tc
1af30 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
1af40 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f  Tail);.    Tcl_O
1af50 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
1af60 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54  , objv[4], 0, pT
1af70 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ail, 0);.    Tcl
1af80 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _DecrRefCount(pT
1af90 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ail);.  }..  if(
1afa0 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
1afb0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1afc0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1afd0 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
1afe0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1aff0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  ROR;.  }.  Tcl_A
1b000 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b010 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65  rp, zBuf, 0);.#e
1b020 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b030 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
1b040 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b050 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b060 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e  lite3_open filen
1b070 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73  ame ?options-lis
1b080 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t?.*/.static int
1b090 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f   test_open(.  vo
1b0a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b0b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b0c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b0d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b0e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1b0f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1b100 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
1b110 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
1b120 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1b130 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1b140 20 26 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f   && objc!=2 && o
1b150 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
1b160 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b170 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1b180 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1b190 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1b1a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b1b0 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20  0]), " filename 
1b1c0 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30  options-list", 0
1b1d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1b1e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1b1f0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63  zFilename = objc
1b200 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69  >1 ? Tcl_GetStri
1b210 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b  ng(objv[1]) : 0;
1b220 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1b230 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
1b240 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73  &db);.  .  if( s
1b250 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1b260 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1b270 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
1b280 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b290 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b2a0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1b2b0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1b2c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1b2d0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1b2e0 6e 5f 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c  n_v2 FILENAME FL
1b2f0 41 47 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69  AGS VFS.*/.stati
1b300 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f  c int test_open_
1b310 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
1b320 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1b330 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b340 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b350 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b360 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
1b370 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
1b380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
1b390 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  s;.  int flags =
1b3a0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
1b3b0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
1b3c0 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1b3d0 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54    int nFlag;.  T
1b3e0 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b  cl_Obj **apFlag;
1b3f0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
1b400 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1b410 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b420 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1b430 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47  , "FILENAME FLAG
1b440 53 20 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74  S VFS");.    ret
1b450 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b460 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
1b470 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b480 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20  bjv[1]);.  zVfs 
1b490 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1b4a0 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  objv[3]);.  if( 
1b4b0 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20  zVfs[0]==0x00 ) 
1b4c0 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20  zVfs = 0;..  rc 
1b4d0 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74  = Tcl_ListObjGet
1b4e0 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
1b4f0 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67   objv[2], &nFlag
1b500 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66  , &apFlag);.  if
1b510 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
1b520 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28  eturn rc;.  for(
1b530 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b  i=0; i<nFlag; i+
1b540 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61  +){.    int iFla
1b550 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70  g;.    struct Op
1b560 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63  enFlag {.      c
1b570 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67  onst char *zFlag
1b580 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
1b590 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20  ;.    } aFlag[] 
1b5a0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c  = {.      { "SQL
1b5b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1b5c0 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y", SQLITE_OPEN_
1b5d0 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
1b5e0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b5f0 5f 52 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c  _READWRITE", SQL
1b600 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1b610 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  TE },.      { "S
1b620 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1b630 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1b640 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
1b650 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  { "SQLITE_OPEN_D
1b660 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53  ELETEONCLOSE", S
1b670 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1b680 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20  EONCLOSE },.    
1b690 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b6a0 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c  _EXCLUSIVE", SQL
1b6b0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1b6c0 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  VE },.      { "S
1b6d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1b6e0 52 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ROXY", SQLITE_OP
1b6f0 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a  EN_AUTOPROXY },.
1b700 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b710 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53  OPEN_MAIN_DB", S
1b720 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1b730 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  DB },.      { "S
1b740 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1b750 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1b760 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20  _TEMP_DB },.    
1b770 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b780 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20  _TRANSIENT_DB", 
1b790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1b7a0 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20  SIENT_DB },.    
1b7b0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b7c0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20  _MAIN_JOURNAL", 
1b7d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1b7e0 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1b7f0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b800 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20  _TEMP_JOURNAL", 
1b810 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1b820 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1b830 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b840 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  _SUBJOURNAL", SQ
1b850 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
1b860 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RNAL },.      { 
1b870 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  "SQLITE_OPEN_MAS
1b880 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  TER_JOURNAL", SQ
1b890 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1b8a0 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1b8b0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b8c0 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54  _NOMUTEX", SQLIT
1b8d0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d  E_OPEN_NOMUTEX }
1b8e0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1b8f0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1b900 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  ", SQLITE_OPEN_F
1b910 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20  ULLMUTEX },.    
1b920 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b930 5f 53 48 41 52 45 44 43 41 43 48 45 22 2c 20 53  _SHAREDCACHE", S
1b940 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
1b950 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
1b960 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  { "SQLITE_OPEN_P
1b970 52 49 56 41 54 45 43 41 43 48 45 22 2c 20 53 51  RIVATECACHE", SQ
1b980 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
1b990 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
1b9a0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  { "SQLITE_OPEN_W
1b9b0 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1b9c0 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  _WAL },.      { 
1b9d0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  "SQLITE_OPEN_URI
1b9e0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  ", SQLITE_OPEN_U
1b9f0 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c  RI },.      { 0,
1ba00 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0 }.    };.    
1ba10 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65  rc = Tcl_GetInde
1ba20 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69  xFromObjStruct(i
1ba30 6e 74 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d  nterp, apFlag[i]
1ba40 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28  , aFlag, sizeof(
1ba50 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20  aFlag[0]), .    
1ba60 20 20 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26      "flag", 0, &
1ba70 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20  iFlag.    );.   
1ba80 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1ba90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1baa0 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b   flags |= aFlag[
1bab0 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d  iFlag].flag;.  }
1bac0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1bad0 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61  _open_v2(zFilena
1bae0 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20  me, &db, flags, 
1baf0 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c  zVfs);.  if( sql
1bb00 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1bb10 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1bb20 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1bb30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1bb40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bb50 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1bb60 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1bb70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1bb80 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  e: sqlite3_open1
1bb90 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  6 filename optio
1bba0 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ns.*/.static int
1bbb0 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20   test_open16(.  
1bbc0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1bbd0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1bbe0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1bbf0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1bc00 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1bc10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bc20 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73  MIT_UTF16.  cons
1bc30 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
1bc40 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
1bc50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
1bc60 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
1bc70 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1bc80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1bc90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1bca0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1bcb0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1bcc0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1bcd0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c  (objv[0]), " fil
1bce0 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69  ename options-li
1bcf0 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  st", 0);.    ret
1bd00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bd10 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   }..  zFilename 
1bd20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
1bd30 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
1bd40 5d 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  ], 0);.  rc = sq
1bd50 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69  lite3_open16(zFi
1bd60 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
1bd70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1bd80 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1bd90 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1bda0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1bdb0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1bdc0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1bdd0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1bde0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1bdf0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1be00 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1be10 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1be20 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c  te3_complete16 <
1be30 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a  UTF-16 string>.*
1be40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1be50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72   the supplied ar
1be60 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70  gument is a comp
1be70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
1be80 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f  nt, or zero.** o
1be90 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1bea0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d  tic int test_com
1beb0 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20  plete16(.  void 
1bec0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1bed0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1bee0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1bef0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1bf00 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21   objv[].){.#if !
1bf10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1bf20 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26  MIT_COMPLETE) &&
1bf30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bf40 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63  _OMIT_UTF16).  c
1bf50 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66  har *zBuf;..  if
1bf60 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1bf70 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1bf80 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1bf90 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e  v, "<utf-16 sql>
1bfa0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1bfb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1bfc0 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54   zBuf = (char*)T
1bfd0 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1bfe0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
1bff0 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  0);.  Tcl_SetObj
1c000 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1c010 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1c020 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28  ite3_complete16(
1c030 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20  zBuf)));.#endif 
1c040 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1c050 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54  OMPLETE && SQLIT
1c060 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1c070 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1c090 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54   sqlite3_step ST
1c0a0 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  MT.**.** Advance
1c0b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1c0c0 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a  o the next row..
1c0d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1c0e0 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20  st_step(.  void 
1c0f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1c100 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c110 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1c120 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c130 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1c140 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1c150 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1c160 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1c170 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c180 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1c190 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1c1a0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1c1b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c1c0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22  bjv[0]), " STMT"
1c1d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c1e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c1f0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1c200 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1c210 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c220 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1c230 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c240 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c250 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
1c260 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49   /* if( rc!=SQLI
1c270 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53  TE_DONE && rc!=S
1c280 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75  QLITE_ROW ) retu
1c290 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f  rn TCL_ERROR; */
1c2a0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1c2b0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1c2c0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1c2d0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1c2e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
1c2f0 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a 20   int test_sql(. 
1c300 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1c310 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1c320 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1c330 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1c340 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1c350 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1c360 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1c370 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1c380 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1c390 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1c3a0 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
1c3b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c3c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1c3d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1c3e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c3f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1c400 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c410 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
1c420 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1c430 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71 6c  ar *)sqlite3_sql
1c440 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c  (pStmt), TCL_VOL
1c450 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e  ATILE);.  return
1c460 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c470 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1c480 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54  _column_count ST
1c490 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
1c4a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1c4b0 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
1c4c0 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
1c4d0 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
1c4e0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1c4f0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  lumn_count(.  vo
1c500 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c510 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c520 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c530 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c540 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c550 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c560 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1c570 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1c580 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c590 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1c5a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1c5b0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1c5c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1c5d0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1c5e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c5f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c600 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1c610 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1c620 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c630 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1c640 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c650 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1c660 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1c670 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1c680 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
1c690 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
1c6a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1c6b0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1c6c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  te3_column_type 
1c6d0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1c6e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70  * Return the typ
1c6f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e  e of the data in
1c700 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1c710 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1c720 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
1c730 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74  nt test_column_t
1c740 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ype(.  void * cl
1c750 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c760 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c770 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1c780 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1c790 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1c7a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1c7b0 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74  int col;.  int t
1c7c0 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  p;..  if( objc!=
1c7d0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1c7e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c7f0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1c800 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1c810 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1c820 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1c830 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1c840 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1c850 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1c860 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1c870 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1c880 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1c890 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1c8a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c8b0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1c8c0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1c8d0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1c8e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c8f0 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74  R;..  tp = sqlit
1c900 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
1c910 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77  Stmt, col);.  sw
1c920 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20  itch( tp ){.    
1c930 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
1c940 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f  GER: .      Tcl_
1c950 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1c960 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c  , "INTEGER", TCL
1c970 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1c980 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c990 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20   SQLITE_NULL:.  
1c9a0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1c9b0 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22  t(interp, "NULL"
1c9c0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1c9d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c9e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
1c9f0 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  AT:.      Tcl_Se
1ca00 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1ca10 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41  "FLOAT", TCL_STA
1ca20 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1ca30 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1ca40 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  ITE_TEXT:.      
1ca50 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1ca60 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43  terp, "TEXT", TC
1ca70 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1ca80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1ca90 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
1caa0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1cab0 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42  lt(interp, "BLOB
1cac0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1cad0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cae0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1caf0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a   assert(0);.  }.
1cb00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cb10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1cb20 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1cb30 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75  _int64 STMT colu
1cb40 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
1cb50 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
1cb60 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
1cb70 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
1cb80 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64  ast as an.** wid
1cb90 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67  e (64-bit) integ
1cba0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1cbb0 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e  t test_column_in
1cbc0 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
1cbd0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1cbe0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1cbf0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1cc00 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1cc10 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1cc20 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1cc30 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69  int col;.  i64 i
1cc40 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
1cc50 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1cc60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1cc70 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1cc80 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1cc90 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1cca0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1ccb0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1ccc0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ccd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1cce0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1ccf0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1cd00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1cd10 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1cd20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cd30 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1cd40 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1cd50 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1cd60 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1cd70 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73  ROR;..  iVal = s
1cd80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1cd90 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  t64(pStmt, col);
1cda0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1cdb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1cdc0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56  NewWideIntObj(iV
1cdd0 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
1cde0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1cdf0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1ce00 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20  olumn_blob STMT 
1ce10 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
1ce20 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
1ce30 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
1ce40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ce50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ce60 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1ce70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ce80 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1ce90 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1cea0 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e    int col;..  in
1ceb0 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76  t len;.  const v
1cec0 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69  oid *pBlob;..  i
1ced0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1cee0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1cef0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1cf00 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1cf10 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1cf20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1cf30 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1cf40 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1cf50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cf60 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1cf70 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1cf80 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1cf90 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1cfa0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1cfb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1cfc0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1cfd0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1cfe0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1cff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c   TCL_ERROR;..  l
1d000 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  en = sqlite3_col
1d010 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
1d020 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d   col);.  pBlob =
1d030 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d040 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29  blob(pStmt, col)
1d050 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1d060 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1d070 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1d080 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20  (pBlob, len));. 
1d090 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d0a0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1d0b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1d0c0 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ouble STMT colum
1d0d0 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1d0e0 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
1d0f0 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
1d100 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
1d110 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a  st as a double..
1d120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1d130 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
1d140 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d150 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d160 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d170 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d180 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d190 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1d1a0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1d1b0 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72   col;.  double r
1d1c0 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
1d1d0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1d1e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d1f0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1d200 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d210 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1d220 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1d230 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1d240 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d250 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d260 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1d270 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1d280 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d290 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1d2a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d2b0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1d2c0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1d2d0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1d2e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d2f0 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73  ROR;..  rVal = s
1d300 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1d310 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  uble(pStmt, col)
1d320 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1d330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1d340 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56  _NewDoubleObj(rV
1d350 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
1d360 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d370 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64  Usage: sqlite3_d
1d380 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a  ata_count STMT .
1d390 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1d3a0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
1d3b0 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ns returned by t
1d3c0 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
1d3d0 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
1d3e0 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63   int test_data_c
1d3f0 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  ount(.  void * c
1d400 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d410 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d420 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d430 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d440 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1d450 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
1d460 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1d470 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d480 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1d490 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1d4a0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1d4b0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1d4c0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1d4d0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1d4e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1d4f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1d500 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1d510 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1d520 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1d530 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1d540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
1d550 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1d560 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1d570 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61  ntObj(sqlite3_da
1d580 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29  ta_count(pStmt))
1d590 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1d5a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1d5b0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1d5c0 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
1d5d0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1d5e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d5f0 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
1d600 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1d610 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1d620 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
1d630 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1d640 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a  test_stmt_utf8(.
1d650 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d660 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ata,        /* P
1d670 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
1d680 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
1d690 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   be invoke */.  
1d6a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d6b0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1d6c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1d6d0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1d6e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1d6f0 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63  ;.  int col;.  c
1d700 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75  onst char *(*xFu
1d710 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
1d720 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74  *, int);.  const
1d730 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
1d740 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63  xFunc = (const c
1d750 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  har *(*)(sqlite3
1d760 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1d770 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1d780 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1d790 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d7a0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d7b0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d7c0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d7d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d7e0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1d7f0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1d800 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d810 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1d820 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1d830 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d840 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1d850 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d860 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1d870 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1d880 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1d890 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1d8a0 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
1d8b0 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
1d8c0 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
1d8d0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
1d8e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1d8f0 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
1d900 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1d910 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1d920 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
1d930 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  over(.  void * c
1d940 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d950 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d960 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d970 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d980 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1d990 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
1d9a0 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b  ECATED.  int rc;
1d9b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
1d9c0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1d9d0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1d9e0 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
1d9f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1da00 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
1da10 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
1da20 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65  over();.  Tcl_Se
1da30 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1da40 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1da50 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1da60 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  TIC);.#endif.  r
1da70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1da80 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1da90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1daa0 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
1dab0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1dac0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
1dad0 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
1dae0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1daf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
1db00 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1db10 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1db20 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69  tmt_utf16(.  voi
1db30 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
1db40 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1db50 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
1db60 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
1db70 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ked */.  Tcl_Int
1db80 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1db90 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1dba0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1dbb0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1dbc0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1dbd0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1dbe0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1dbf0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
1dc00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1dc10 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20  Name16;.  const 
1dc20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73  void *(*xFunc)(s
1dc30 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1dc40 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
1dc50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28  const void *(*)(
1dc60 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1dc70 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt))clientData;.
1dc80 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1dc90 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1dca0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1dcb0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1dcc0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1dcd0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1dce0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1dcf0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1dd00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1dd10 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1dd20 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1dd30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1dd40 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1dd50 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1dd60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1dd70 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1dd80 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1dd90 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1dda0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1ddb0 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e    zName16 = xFun
1ddc0 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  c(pStmt, col);. 
1ddd0 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a   if( zName16 ){.
1dde0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63      int n;.    c
1ddf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
1de00 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28  Name16;.    for(
1de10 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e  n=0; z[n] || z[n
1de20 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20  +1]; n+=2){}.   
1de30 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
1de40 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d  yteArrayObj(zNam
1de50 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54  e16, n+2);.    T
1de60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1de70 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
1de80 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1de90 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1dea0 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  /..  return TCL_
1deb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1dec0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1ded0 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75  mn_int STMT colu
1dee0 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1def0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1df00 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ytes STMT column
1df10 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1df20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1df30 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  es16 STMT column
1df40 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
1df50 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28  t test_stmt_int(
1df60 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1df70 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e  Data,    /* Poin
1df80 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1df90 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1dfa0 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
1dfb0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1dfc0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1dfd0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1dfe0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1dff0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1e000 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
1e010 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
1e020 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a  3_stmt*, int);..
1e030 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28    xFunc = (int (
1e040 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  *)(sqlite3_stmt*
1e050 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74  , int))clientDat
1e060 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  a;.  if( objc!=3
1e070 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1e080 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e090 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1e0a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1e0b0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1e0c0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1e0d0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1e0e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e0f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1e100 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1e110 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1e120 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1e130 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1e140 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e150 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1e160 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1e170 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1e180 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e190 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1e1a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1e1b0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e  l_NewIntObj(xFun
1e1c0 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b  c(pStmt, col)));
1e1d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e1e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1e1f0 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61  :  sqlite_set_ma
1e200 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e  gic  DB  MAGIC-N
1e210 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20  UMBER.**.** Set 
1e220 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61  the db->magic va
1e230 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  lue.  This is us
1e240 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72  ed to test error
1e250 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e   recovery logic.
1e260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1e270 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28  qlite_set_magic(
1e280 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1e290 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1e2a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1e2b0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1e2c0 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1e2d0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1e2e0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1e2f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e300 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1e310 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1e320 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
1e330 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49 43        " DB MAGIC
1e340 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1e350 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e360 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1e370 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1e380 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1e390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e3a0 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1e3b0 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1e3c0 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20  C_OPEN")==0 ){. 
1e3d0 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
1e3e0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
1e3f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1e400 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
1e410 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
1e420 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  ED")==0 ){.    d
1e430 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1e440 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
1e450 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1e460 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1e470 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29  ITE_MAGIC_BUSY")
1e480 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1e490 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1e4a0 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  GIC_BUSY;.  }els
1e4b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
1e4c0 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
1e4d0 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29  GIC_ERROR")==0 )
1e4e0 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1e4f0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
1e500 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  RROR;.  }else if
1e510 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
1e520 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69  erp, argv[2], (i
1e530 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20  nt*)&db->magic) 
1e540 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1e550 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1e560 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e570 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1e580 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
1e590 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67    DB .**.** Trig
1e5a0 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74  ger an interrupt
1e5b0 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63   on DB.*/.static
1e5c0 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72   int test_interr
1e5d0 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  upt(.  void * cl
1e5e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1e5f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1e600 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1e610 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ar **argv.){.  s
1e620 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1e630 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1e640 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e650 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1e660 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e670 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1e680 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1e690 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e6a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1e6b0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1e6c0 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1e6d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e6e0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  R;.  sqlite3_int
1e6f0 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65  errupt(db);.  re
1e700 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e710 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74  static u8 *sqlit
1e720 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1e730 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69  e = 0;../*.** Fi
1e740 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74  ll the stack wit
1e750 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74  h a known bitpat
1e760 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tern..*/.static 
1e770 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76  void prepStack(v
1e780 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
1e790 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33   u32 bigBuf[6553
1e7a0 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  6];.  for(i=0; i
1e7b0 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 2f  <sizeof(bigBuf)/
1e7c0 73 69 7a 65 6f 66 28 62 69 67 42 75 66 5b 30 5d  sizeof(bigBuf[0]
1e7d0 29 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69  ); i++) bigBuf[i
1e7e0 5d 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a  ] = 0xdeadbeef;.
1e7f0 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f    sqlite3_stack_
1e800 62 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29  baseline = (u8*)
1e810 26 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a  &bigBuf[65536];.
1e820 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65  }../*.** Get the
1e830 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64   current stack d
1e840 65 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20  epth.  Used for 
1e850 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
1e860 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74  */.u64 sqlite3St
1e870 61 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a  ackDepth(void){.
1e880 20 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e    u8 x;.  return
1e890 20 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73   (u64)(sqlite3_s
1e8a0 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20  tack_baseline - 
1e8b0 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  &x);.}../*.** Us
1e8c0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74  age:  sqlite3_st
1e8d0 61 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a  ack_used DB SQL.
1e8e0 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61  **.** Try to mea
1e8f0 73 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  sure the amount 
1e900 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65 20 75  of stack space u
1e910 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
1e920 20 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f   sqlite3_exec.*/
1e930 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1e940 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76  _stack_used(.  v
1e950 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1e960 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1e970 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1e980 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1e990 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
1e9a0 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
1e9b0 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1e9c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1e9d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1e9e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1e9f0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1ea00 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20  , .        " DB 
1ea10 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  SQL", 0);.    re
1ea20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ea30 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1ea40 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1ea50 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1ea60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ea70 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a  .  prepStack();.
1ea80 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
1ea90 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d  exec(db, argv[2]
1eaa0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f  , 0, 0, 0);.  fo
1eab0 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20  r(i=65535; i>=0 
1eac0 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65  && ((u32*)sqlite
1ead0 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1eae0 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65  )[-i]==0xdeadbee
1eaf0 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f  f; i--){}.  Tcl_
1eb00 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1eb10 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1eb20 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75  bj(i*4));.  retu
1eb30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1eb40 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1eb50 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  e_delete_functio
1eb60 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  n DB function-na
1eb70 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  me.**.** Delete 
1eb80 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
1eb90 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  n 'function-name
1eba0 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  ' from database 
1ebb0 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a  handle DB. It.**
1ebc0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1ebd0 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
1ebe0 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64 20 61  on was created a
1ebf0 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62  s UTF8, any numb
1ec00 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e  er of.** argumen
1ec10 74 73 20 28 74 68 65 20 77 61 79 20 74 68 65 20  ts (the way the 
1ec20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
1ec30 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
1ec40 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e  c int delete_fun
1ec50 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ction(.  void * 
1ec60 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ec70 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ec80 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1ec90 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1eca0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1ecb0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1ecc0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1ecd0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ece0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1ecf0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1ed00 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1ed10 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74        " DB funct
1ed20 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20  ion-name", 0);. 
1ed30 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ed40 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1ed50 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1ed60 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1ed70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1ed80 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1ed90 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1eda0 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
1edb0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
1edc0 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  8, 0, 0, 0, 0);.
1edd0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1ede0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1edf0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1ee00 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
1ee10 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ee20 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1ee30 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c  qlite_delete_col
1ee40 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74  lation DB collat
1ee50 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44  ion-name.**.** D
1ee60 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74  elete the collat
1ee70 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f  ion sequence 'co
1ee80 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72  llation-name' fr
1ee90 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  om database hand
1eea0 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73  le .** DB. It is
1eeb0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1eec0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1eed0 65 6e 63 65 20 77 61 73 20 63 72 65 61 74 65 64  ence was created
1eee0 20 61 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a   as UTF8 (the .*
1eef0 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e  * way the TCL in
1ef00 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29  terface does it)
1ef10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ef20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  delete_collation
1ef30 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ef40 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ef50 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ef60 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1ef70 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1ef80 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
1ef90 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
1efa0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1efb0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1efc0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1efd0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1efe0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1eff0 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e   " DB function-n
1f000 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ame", 0);.    re
1f010 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f020 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1f030 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1f040 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1f050 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f060 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1f070 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1f080 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51  (db, argv[2], SQ
1f090 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29  LITE_UTF8, 0, 0)
1f0a0 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
1f0b0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1f0c0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1f0d0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
1f0e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f0f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1f100 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
1f110 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a  ocommit DB.**.**
1f120 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1f130 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20  the database DB 
1f140 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
1f150 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65  auto-commit mode
1f160 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
1f170 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
1f180 74 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f  tic int get_auto
1f190 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a  commit(.  void *
1f1a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1f1b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f1c0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1f1d0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1f1e0 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
1f1f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1f200 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
1f210 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1f220 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1f230 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1f240 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1f250 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1f260 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1f270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f280 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1f290 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1f2a0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1f2b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f2c0 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
1f2d0 22 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65  "%d", sqlite3_ge
1f2e0 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29  t_autocommit(db)
1f2f0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1f300 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1f310 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
1f320 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1f330 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1f340 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42  _busy_timeout DB
1f350 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68   MS.**.** Set th
1f360 65 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20  e busy timeout. 
1f370 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61   This is more ea
1f380 73 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20  sily done using 
1f390 74 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d  the timeout.** m
1f3a0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c  ethod of the TCL
1f3b0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74   interface.  But
1f3c0 20 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74   we need a way t
1f3d0 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a  o test the case.
1f3e0 2a 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75  ** where it retu
1f3f0 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  rns SQLITE_MISUS
1f400 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1f410 20 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f   test_busy_timeo
1f420 75 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ut(.  void * cli
1f430 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1f440 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1f450 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1f460 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  r **argv.){.  in
1f470 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69  t rc, ms;.  sqli
1f480 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1f490 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1f4a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f4b0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f4c0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f4d0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1f4e0 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
1f4f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f500 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1f510 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1f520 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1f530 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1f540 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1f550 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
1f560 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20  , argv[2], &ms) 
1f570 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f580 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1f590 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
1f5a0 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41  db, ms);.  Tcl_A
1f5b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f5c0 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45  rp, sqlite3TestE
1f5d0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
1f5e0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f5f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1f600 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65  e:  tcl_variable
1f610 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41  _type VARIABLENA
1f620 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
1f630 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1f640 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
1f650 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  ntation for the.
1f660 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
1f670 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a  given variable..
1f680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
1f690 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28  l_variable_type(
1f6a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1f6b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1f6c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1f6d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1f6e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1f6f0 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
1f700 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ar;.  if( objc!=
1f710 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1f720 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1f730 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49  , 1, objv, "VARI
1f740 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75  ABLE");.    retu
1f750 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f760 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47  }.  pVar = Tcl_G
1f770 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c  etVar2Ex(interp,
1f780 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1f790 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f  bjv[1]), 0, TCL_
1f7a0 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a  LEAVE_ERR_MSG);.
1f7b0 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20    if( pVar==0 ) 
1f7c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f7d0 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79  ;.  if( pVar->ty
1f7e0 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c  pePtr ){.    Tcl
1f7f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1f800 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
1f810 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70  ingObj(pVar->typ
1f820 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29  ePtr->name, -1))
1f830 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1f840 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f850 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1f860 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f  release_memory ?
1f870 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  N?.**.** Attempt
1f880 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
1f890 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ry currently hel
1f8a0 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  d but not actual
1f8b0 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  ly required..** 
1f8c0 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73  The integer N is
1f8d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1f8e0 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69  ytes we are tryi
1f8f0 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20  ng to release.  
1f900 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76  The .** return v
1f910 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75  alue is the amou
1f920 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74  nt of memory act
1f930 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a  ually released..
1f940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f950 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
1f960 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
1f970 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1f980 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1f990 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1f9a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1f9b0 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ].){.#if defined
1f9c0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
1f9d0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
1f9e0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1f9f0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
1fa00 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74  ).  int N;.  int
1fa10 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63   amt;.  if( objc
1fa20 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29  !=1 && objc!=2 )
1fa30 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1fa40 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1fa50 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a  , objv, "?N?");.
1fa60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1fa70 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1fa80 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69  objc==2 ){.    i
1fa90 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1faa0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1fab0 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
1fac0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1fad0 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d  }else{.    N = -
1fae0 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73  1;.  }.  amt = s
1faf0 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
1fb00 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f  emory(N);.  Tcl_
1fb10 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1fb20 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1fb30 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66  bj(amt));.#endif
1fb40 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1fb50 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
1fb60 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  e:  sqlite3_db_r
1fb70 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42  elease_memory DB
1fb80 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
1fb90 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
1fba0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1fbb0 62 79 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  by database DB. 
1fbc0 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72   Return the.** r
1fbd0 65 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63  esult code (whic
1fbe0 68 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  h in the current
1fbf0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1fc00 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e  is always zero).
1fc10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1fc20 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  est_db_release_m
1fc30 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20  emory(.  void * 
1fc40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1fc50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1fc60 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1fc70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1fc80 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1fc90 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1fca0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1fcb0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1fcc0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1fcd0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
1fce0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1fcf0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1fd00 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1fd10 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1fd20 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1fd30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1fd40 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1fd50 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
1fd60 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54 63  memory(db);.  Tc
1fd70 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1fd80 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1fd90 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74  tObj(rc));.  ret
1fda0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1fdb0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1fdc0 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
1fdd0 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a   DB DBNAME.**.**
1fde0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
1fdf0 20 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63   of a file assoc
1fe00 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1fe10 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1fe20 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 66 69 6c   int test_db_fil
1fe30 65 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20  ename(.  void * 
1fe40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1fe50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1fe60 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1fe70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1fe80 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1fe90 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
1fea0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20  char *zDbName;. 
1feb0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1fec0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1fed0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1fee0 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
1fef0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1ff00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1ff10 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1ff20 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1ff30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1ff40 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1ff50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e  CL_ERROR;.  zDbN
1ff60 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
1ff70 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
1ff80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ff90 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
1ffa0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c  _db_filename(db,
1ffb0 20 7a 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64   zDbName), (void
1ffc0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1ffd0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1ffe0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1fff0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20  soft_heap_limit 
20000 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20  ?N?.**.** Query 
20010 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66 74 20  or set the soft 
20020 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20 74  heap limit for t
20030 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
20040 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74  d.  The.** limit
20050 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64   is only changed
20060 20 69 66 20 74 68 65 20 4e 20 69 73 20 70 72 65   if the N is pre
20070 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76 69  sent.  The previ
20080 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20  ous limit.** is 
20090 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
200a0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6f 66  tic int test_sof
200b0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20  t_heap_limit(.  
200c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
200d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
200e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
200f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20100 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20110 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
20120 61 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt;.  sqlite3_i
20130 6e 74 36 34 20 4e 20 3d 20 2d 31 3b 0a 20 20 69  nt64 N = -1;.  i
20140 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
20150 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
20160 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
20170 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
20180 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
20190 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
201a0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
201b0 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
201c0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
201d0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
201e0 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &N) ) return TC
201f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  L_ERROR;.  }.  a
20200 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66  mt = sqlite3_sof
20210 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e  t_heap_limit64(N
20220 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
20230 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
20240 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
20250 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  amt));.  return 
20260 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20270 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
20280 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
20290 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
202a0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
202b0 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73  leanup API..*/.s
202c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74  tatic int test_t
202d0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20  hread_cleanup(. 
202e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
202f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
20300 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
20310 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
20320 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
20330 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20340 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
20350 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64    sqlite3_thread
20360 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64  _cleanup();.#end
20370 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
20380 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
20390 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61  ge:   sqlite3_pa
203a0 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44  ger_refcounts  D
203b0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  B.**.** Return a
203c0 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73   list of numbers
203d0 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 50   which are the P
203e0 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72  agerRefcount for
203f0 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f   all.** pagers o
20400 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  n each database 
20410 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
20420 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
20430 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a  ager_refcounts(.
20440 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20450 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20460 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20470 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20480 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20490 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
204a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
204b0 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a  v, *a;.  Tcl_Obj
204c0 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66   *pResult;..  if
204d0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
204e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
204f0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
20500 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
20510 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
20520 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
20530 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
20540 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
20550 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20560 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
20570 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
20580 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
20590 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
205a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
205b0 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54  R;.  pResult = T
205c0 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66  cl_NewObj();.  f
205d0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
205e0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
205f0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
20600 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
20610 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
20620 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
20630 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
20640 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73  ex);.      a = s
20650 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
20660 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
20670 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  er(db->aDb[i].pB
20680 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61  t));.      v = a
20690 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [0];.      sqlit
206a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
206b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  b->mutex);.    }
206c0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
206d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
206e0 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65   pResult, Tcl_Ne
206f0 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d  wIntObj(v));.  }
20700 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
20710 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73  ult(interp, pRes
20720 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
20730 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
20740 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69   tclcmd:   worki
20750 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a  ng_64bit_int.**.
20760 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c  ** Some TCL buil
20770 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20  ds (ex: cygwin) 
20780 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36  do not support 6
20790 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
207a0 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74   This.** leads t
207b0 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  o a number of te
207c0 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68  st failures.  Th
207d0 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e  e present comman
207e0 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20  d checks the.** 
207f0 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65  TCL build to see
20800 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
20810 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62  it supports 64-b
20820 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74  it integers.  It
20830 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45  .** returns TRUE
20840 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
20850 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a  FALSE if not..**
20860 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
20870 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e   is used to warn
20880 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65 69   users that thei
20890 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64  r TCL build is d
208a0 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20  efective.** and 
208b0 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73 20  that the errors 
208c0 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67 20  they are seeing 
208d0 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72 69  in the test scri
208e0 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  pts might be.** 
208f0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69  a result of thei
20900 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c 20  r defective TCL 
20910 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62  rather than prob
20920 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  lems in SQLite..
20930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 6f  */.static int wo
20940 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28  rking_64bit_int(
20950 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
20960 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
20970 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
20980 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
20990 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
209a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
209b0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
209c0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
209d0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
209e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a00 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
20a10 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
20a20 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
20a30 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
20a40 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
20a50 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a  _Obj *pTestObj;.
20a60 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20    int working = 
20a70 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d  0;..  pTestObj =
20a80 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
20a90 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29  bj(1000000*(i64)
20aa0 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77  1234567890);.  w
20ab0 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28  orking = strcmp(
20ac0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54  Tcl_GetString(pT
20ad0 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36  estObj), "123456
20ae0 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b  7890000000")==0;
20af0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
20b00 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20  unt(pTestObj);. 
20b10 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
20b20 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
20b30 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b  wBooleanObj(work
20b40 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ing));.  return 
20b50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
20b60 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
20b70 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a  unlink_test.**.*
20b80 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
20b90 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74  nd unregisters t
20ba0 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61  he primary VFS a
20bb0 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  nd then register
20bc0 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61  s.** it back aga
20bd0 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  in.  This is use
20be0 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62  d to test the ab
20bf0 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65  ility to registe
20c00 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20  r a.** VFS when 
20c10 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75  none are previou
20c20 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20  sly registered, 
20c30 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20  and the ability 
20c40 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65  to .** unregiste
20c50 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c  r the only avail
20c60 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65  able VFS.  Ticke
20c70 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69  t #2738.*/.stati
20c80 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b  c int vfs_unlink
20c90 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
20ca0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
20cb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
20cc0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
20cd0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
20ce0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
20cf0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
20d00 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
20d10 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
20d20 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
20d30 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
20d40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20d50 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
20d60 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
20d70 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
20d80 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
20d90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
20da0 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a  te3_vfs *pMain;.
20db0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61    sqlite3_vfs *a
20dc0 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69  pVfs[20];.  sqli
20dd0 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f  te3_vfs one, two
20de0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ;..  sqlite3_vfs
20df0 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20  _unregister(0); 
20e00 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
20e10 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c  of NULL is harml
20e20 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61  ess */.  one.zNa
20e30 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20  me = "__one";.  
20e40 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74  two.zName = "__t
20e50 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69  wo";..  /* Calli
20e60 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  ng sqlite3_vfs_r
20e70 65 67 69 73 74 65 72 20 77 69 74 68 20 32 6e 64  egister with 2nd
20e80 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64   argument of 0 d
20e90 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61  oes not.  ** cha
20ea0 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
20eb0 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e  VFS.  */.  pMain
20ec0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
20ed0 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  ind(0);.  sqlite
20ee0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
20ef0 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  one, 0);.  asser
20f00 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70  t( pMain==0 || p
20f10 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66  Main==sqlite3_vf
20f20 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73  s_find(0) );.  s
20f30 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
20f40 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20  ter(&two, 0);.  
20f50 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
20f60 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
20f70 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
20f80 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66  ;..  /* We can f
20f90 69 6e 64 20 61 20 56 46 53 20 62 79 20 69 74 73  ind a VFS by its
20fa0 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72   name */.  asser
20fb0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20fc0 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
20fd0 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
20fe0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20ff0 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
21000 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  );..  /* Calling
21010 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69   sqlite_vfs_regi
21020 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65  ster with non-ze
21030 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  ro second parame
21040 74 65 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a  ter changes the.
21050 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53    ** default VFS
21060 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 31 73  , even if the 1s
21070 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
21080 6e 20 65 78 69 73 74 69 67 20 56 46 53 20 74 68  n existig VFS th
21090 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69  at is.  ** previ
210a0 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
210b0 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61   as the non-defa
210c0 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ult..  */.  sqli
210d0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
210e0 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73  (&one, 1);.  ass
210f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21100 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
21110 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
21120 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21130 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
21140 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
21150 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21160 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71  0)==&one );.  sq
21170 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
21180 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61  er(&two, 1);.  a
21190 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
211a0 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
211b0 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65  ==&one );.  asse
211c0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
211d0 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
211e0 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  two );.  assert(
211f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21200 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  d(0)==&two );.  
21210 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20  if( pMain ){.   
21220 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21230 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b  ister(pMain, 1);
21240 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
21250 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
21260 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a  _one")==&one );.
21270 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
21280 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
21290 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  two")==&two );. 
212a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
212b0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
212c0 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a  pMain );.  }.  .
212d0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
212e0 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65  default VFS.  Re
212f0 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65  peat until there
21300 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53   are no more VFS
21310 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  es.  ** register
21320 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
21330 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56  =0; i<sizeof(apV
21340 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73  fs)/sizeof(apVfs
21350 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
21360 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
21370 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
21380 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
21390 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
213a0 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
213b0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
213c0 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
213d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
213e0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70  fs_unregister(ap
213f0 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  Vfs[i]);.      a
21400 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
21410 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
21420 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
21430 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
21440 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
21450 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a  s_find(0) );.  .
21460 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
21470 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f  e main VFS as no
21480 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20  n-default (will 
21490 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c  be made default,
214a0 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c   since.  ** it'l
214b0 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e  l be the only on
214c0 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e  e in existence).
214d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
214e0 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61  vfs_register(pMa
214f0 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  in, 0);.  assert
21500 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21510 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
21520 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73    .  /* Un-regis
21530 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53  ter the main VFS
21540 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72   again to restor
21550 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c  e an empty VFS l
21560 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
21570 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
21580 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74  pMain);.  assert
21590 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  ( 0==sqlite3_vfs
215a0 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f  _find(0) );..  /
215b0 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53  * Relink all VFS
215c0 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
215d0 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28  der. */  .  for(
215e0 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i=sizeof(apVfs)/
215f0 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
21600 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
21610 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
21620 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21630 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61  3_vfs_register(a
21640 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20  pVfs[i], 1);.   
21650 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
21660 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
21670 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20  _find(0) );.    
21680 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b    assert( apVfs[
21690 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  i]==sqlite3_vfs_
216a0 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a  find(apVfs[i]->z
216b0 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Name) );.    }. 
216c0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73   }..  /* Unregis
216d0 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56  ter out sample V
216e0 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  FSes. */.  sqlit
216f0 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
21700 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  r(&one);.  sqlit
21710 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
21720 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55  r(&two);..  /* U
21730 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 56  nregistering a V
21740 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63  FS that is not c
21750 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65  urrently registe
21760 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20  red is harmless 
21770 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
21780 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65  _unregister(&one
21790 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
217a0 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f  _unregister(&two
217b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
217c0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
217d0 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61  _one")==0 );.  a
217e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
217f0 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
21800 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  ==0 );..  /* We 
21810 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77  should be left w
21820 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ith the original
21830 20 64 65 66 61 75 6c 74 20 56 46 53 20 62 61 63   default VFS bac
21840 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72  k as the.  ** or
21850 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65  iginal */.  asse
21860 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21870 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
21880 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
21890 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
218a0 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66  cmd:   vfs_initf
218b0 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54  ail_test.**.** T
218c0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
218d0 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f  attempts to vfs_
218e0 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67  find and vfs_reg
218f0 69 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a  ister when the.*
21900 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
21910 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65  lize() interface
21920 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c   is failing.  Al
21930 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66  l calls should f
21940 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ail..*/.static i
21950 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f  nt vfs_initfail_
21960 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
21970 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
21980 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
21990 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
219a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
219b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
219c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
219d0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
219e0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
219f0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
21a00 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
21a10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21a20 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
21a30 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
21a40 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
21a50 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
21a60 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e    sqlite3_vfs on
21a70 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  e;.  one.zName =
21a80 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28   "__one";..  if(
21a90 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21aa0 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
21ab0 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
21ac0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21ad0 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  &one, 0);.  if( 
21ae0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21af0 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
21b00 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
21b10 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
21b20 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  one, 1);.  if( s
21b30 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21b40 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
21b50 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
21b60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
21b70 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a   Saved VFSes.*/.
21b80 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
21b90 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73  fs *apVfs[20];.s
21ba0 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d  tatic int nVfs =
21bb0 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   0;../*.** tclcm
21bc0 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73  d:   vfs_unregis
21bd0 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e  ter_all.**.** Un
21be0 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  register all VFS
21bf0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
21c00 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  t vfs_unregister
21c10 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _all(.  ClientDa
21c20 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
21c30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
21c40 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
21c50 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
21c60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
21c70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
21c80 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
21c90 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
21ca0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
21cb0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
21cc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21cd0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
21ce0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
21cf0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
21d00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
21d10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
21d20 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
21d30 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20  apVfs); i++){.  
21d40 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c    apVfs[i] = sql
21d50 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
21d60 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  ;.    if( apVfs[
21d70 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i]==0 ) break;. 
21d80 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
21d90 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
21da0 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20  i]);.  }.  nVfs 
21db0 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  = i;.  return TC
21dc0 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
21dd0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65  lcmd:   vfs_rere
21de0 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
21df0 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53   Restore all VFS
21e00 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65 6d  es that were rem
21e10 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75  oved using vfs_u
21e20 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f  nregister_all.*/
21e30 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
21e40 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a  reregister_all(.
21e50 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
21e60 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
21e70 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
21e80 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
21e90 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
21ea0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
21eb0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
21ec0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
21ed0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
21ee0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21f00 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
21f10 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
21f20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
21f30 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
21f40 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
21f50 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
21f60 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVfs; i++){.    
21f70 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
21f80 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 69  ster(apVfs[i], i
21f90 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ==0);.  }.  retu
21fa0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
21fb0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
21fc0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
21fd0 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54   DB.**.** This T
21fe0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
21ff0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
22000 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
22010 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
22020 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
22030 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
22040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22050 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
22060 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
22070 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
22080 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
22090 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
220a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
220b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
220c0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
220d0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
220e0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
220f0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
22100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22110 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
22120 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
22130 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
22140 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
22150 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
22160 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73  nt iArg = 0;.  s
22170 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
22180 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
22190 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
221a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
221b0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
221c0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
221d0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
221e0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
221f0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
22200 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
22210 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22220 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
22230 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
22240 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
22250 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
22260 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22270 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22280 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c  e_control(db, 0,
22290 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73   0, &iArg);.  as
222a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
222b0 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72  _NOTFOUND );.  r
222c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
222d0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f  _control(db, "no
222e0 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c  tadatabase", SQL
222f0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
22300 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  ATE, &iArg);.  a
22310 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
22320 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20  E_ERROR );.  rc 
22330 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
22340 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e  ontrol(db, "main
22350 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
22360 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
22370 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
22380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
22390 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
223a0 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72  "temp", -1, &iAr
223b0 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
223c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
223d0 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  D || rc==SQLITE_
223e0 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74 75  ERROR );..  retu
223f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
22400 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
22410 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
22420 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a 2a  errno_test DB.**
22430 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
22440 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
22450 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22460 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
22470 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
22480 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
22490 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41 53  f the SQLITE_LAS
224a0 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f  T_ERRNO verb..*/
224b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
224c0 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
224d0 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  no_test(.  Clien
224e0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
224f0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
22500 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
22510 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
22520 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
22530 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
22540 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
22550 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
22560 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
22570 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
22580 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22590 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
225a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
225b0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
225c0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
225d0 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
225e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
225f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
22600 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
22610 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
22620 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
22630 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
22640 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
22650 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
22660 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
22670 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
22680 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22690 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
226a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
226b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
226c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
226d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
226e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
226f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
22700 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
22710 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  L, SQLITE_LAST_E
22720 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20  RRNO, &iArg);.  
22730 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54  if( rc ){ .    T
22740 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
22750 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
22760 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
22770 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22780 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69 41  R; .  }.  if( iA
22790 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54 63  rg!=0 ) {.    Tc
227a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
227b0 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63 74  nterp, "Unexpect
227c0 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e  ed non-zero errn
227d0 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  o: ",.          
227e0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
227f0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
22800 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 41  Tcl_NewIntObj(iA
22810 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30 29  rg), 0), " ", 0)
22820 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22830 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
22840 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
22850 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22860 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63    file_control_c
22870 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44 42  hunksize_test DB
22880 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a   DBNAME SIZE.**.
22890 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
228a0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
228b0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
228c0 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  l interface and.
228d0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
228e0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
228f0 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f   the SQLITE_GET_
22900 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e  LOCKPROXYFILE an
22910 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f  d.** SQLITE_SET_
22920 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65  LOCKPROXYFILE ve
22930 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rbs..*/.static i
22940 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
22950 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28 0a  chunksize_test(.
22960 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
22970 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
22980 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
22990 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
229a0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
229b0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
229c0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
229d0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
229e0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
229f0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
22a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22a10 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
22a20 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
22a30 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
22a40 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
22a50 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
22a60 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
22a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22a80 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f  ew chunk size */
22a90 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  .  char *zDb;   
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22     /* Db name ("
22ac0 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74  main", "temp" et
22ad0 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  c.) */.  sqlite3
22ae0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
22af0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
22b00 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
22b10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b30 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   /* file_control
22b40 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
22b50 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  /..  if( objc!=4
22b60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
22b70 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
22b80 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
22b90 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20  NAME SIZE");.   
22ba0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22bb0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
22bc0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
22bd0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
22be0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a  objv[1]), &db) .
22bf0 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74     || Tcl_GetInt
22c00 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
22c10 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29  objv[3], &nSize)
22c20 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20  .  ){.   return 
22c30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
22c40 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
22c50 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
22c60 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30   if( zDb[0]=='\0
22c70 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a  ' ) zDb = NULL;.
22c80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
22c90 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
22ca0 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e   zDb, SQLITE_FCN
22cb0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20 28  TL_CHUNK_SIZE, (
22cc0 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a  void *)&nSize);.
22cd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22ce0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
22cf0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
22d00 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
22d10 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
22d20 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
22d30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
22d40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
22d50 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
22d60 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
22d70 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42  sizehint_test DB
22d80 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a   DBNAME SIZE.**.
22d90 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
22da0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
22db0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
22dc0 6c 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20  l interface .** 
22dd0 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54  with SQLITE_FCNT
22de0 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73  L_SIZE_HINT.*/.s
22df0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
22e00 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f  ontrol_sizehint_
22e10 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
22e20 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
22e30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
22e40 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
22e50 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
22e60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
22e70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
22e80 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
22e90 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
22ea0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
22eb0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
22ec0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22ed0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
22ee0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22ef0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
22f00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
22f10 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22f20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
22f30 20 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65    /* Hinted size
22f40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65        /* Db name
22f70 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
22f80 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69   etc.) */.  sqli
22f90 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22fb0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
22fc0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74      /* file_cont
22ff0 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64  rol() return cod
23000 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  e */..  if( objc
23010 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
23020 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
23030 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
23040 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a   DBNAME SIZE");.
23050 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23060 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23070 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23080 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23090 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
230a0 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74  ) .   || Tcl_Get
230b0 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
230c0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
230d0 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  &nSize).  ){.   
230e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
230f0 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
23100 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
23110 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b  [2]);.  if( zDb[
23120 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d  0]=='\0' ) zDb =
23130 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73   NULL;..  rc = s
23140 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23150 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  rol(db, zDb, SQL
23160 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
23170 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53  INT, (void *)&nS
23180 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
23190 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
231a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
231b0 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45  r *)sqlite3TestE
231c0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
231d0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
231e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
231f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
23200 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
23210 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
23220 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
23230 74 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a  test DB PWD.**.*
23240 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
23250 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
23260 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
23270 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
23280 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
23290 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
232a0 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  the SQLITE_GET_L
232b0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64  OCKPROXYFILE and
232c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  .** SQLITE_SET_L
232d0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72  OCKPROXYFILE ver
232e0 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  bs..*/.static in
232f0 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  t file_control_l
23300 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20  ockproxy_test(. 
23310 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
23320 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
23330 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
23340 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
23350 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
23360 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
23370 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
23380 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
23390 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
233a0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
233b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
233c0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
233d0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
233e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
233f0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
23400 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
23410 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
23420 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 69 6e  char *zPwd;.  in
23430 74 20 6e 50 77 64 3b 0a 20 20 0a 20 20 69 66 28  t nPwd;.  .  if(
23440 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
23450 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
23460 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
23470 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
23480 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  e \"",.         
23490 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
234a0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
234b0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
234c0 44 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20  DB PWD", 0);.   
234d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
234e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
234f0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23500 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
23510 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
23520 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
23530 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 50 77  ERROR;.  }.  zPw
23540 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
23550 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
23560 2c 20 26 6e 50 77 64 29 3b 0a 20 20 0a 23 69 66  , &nPwd);.  .#if
23570 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
23580 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23590 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
235a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
235b0 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
235c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
235d0 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
235e0 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
235f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
23600 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
23610 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
23620 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23630 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
23640 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
23650 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  ).  {.    char *
23660 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69 6e  testPath;.    in
23670 74 20 72 63 3b 0a 20 20 20 20 63 68 61 72 20 70  t rc;.    char p
23680 72 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20  roxyPath[400];. 
23690 20 20 20 0a 20 20 20 20 69 66 28 20 73 69 7a 65     .    if( size
236a0 6f 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50  of(proxyPath)<nP
236b0 77 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54  wd+20 ){.      T
236c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
236d0 69 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f  interp, "PWD too
236e0 20 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29   big", (void*)0)
236f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
23700 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
23710 20 20 20 20 73 70 72 69 6e 74 66 28 70 72 6f 78      sprintf(prox
23720 79 50 61 74 68 2c 20 22 25 73 2f 74 65 73 74 2e  yPath, "%s/test.
23730 70 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20  proxy", zPwd);. 
23740 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
23750 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
23760 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45   NULL, SQLITE_SE
23770 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
23780 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
23790 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
237a0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
237b0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
237c0 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20  wIntObj(rc)); . 
237d0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
237e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
237f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23800 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
23810 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ULL, SQLITE_GET_
23820 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
23830 74 65 73 74 50 61 74 68 29 3b 0a 20 20 20 20 69  testPath);.    i
23840 66 28 20 73 74 72 6e 63 6d 70 28 70 72 6f 78 79  f( strncmp(proxy
23850 50 61 74 68 2c 74 65 73 74 50 61 74 68 2c 31 31  Path,testPath,11
23860 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ) ){.      Tcl_A
23870 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23880 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20  rp, "Lock proxy 
23890 66 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61 74  file did not mat
238a0 63 68 20 74 68 65 20 22 0a 20 20 20 20 20 20 20  ch the ".       
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 20 20 20 20 20 20 20 20 22 70 72 65 76 69 6f 75          "previou
238d0 73 6c 79 20 61 73 73 69 67 6e 65 64 20 76 61 6c  sly assigned val
238e0 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ue", 0);.      r
238f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23900 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
23910 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  c ){.      Tcl_S
23920 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
23930 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
23940 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65  j(rc));.      re
23950 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23960 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
23970 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23980 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
23990 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
239a0 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74  XYFILE, proxyPat
239b0 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  h);.    if( rc )
239c0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
239d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
239e0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
239f0 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  c));.      retur
23a00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
23a10 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
23a20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
23a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
23a40 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
23a50 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20  _win32_av_retry 
23a60 44 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41  DB  NRETRY  DELA
23a70 59 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  Y.**.** This TCL
23a80 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
23a90 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
23aa0 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
23ab0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
23ac0 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
23ad0 41 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e  AV_RETRY opcode.
23ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
23af0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
23b00 32 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c  2_av_retry(.  Cl
23b10 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
23b20 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
23b30 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
23b40 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
23b50 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
23b60 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
23b70 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
23b80 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
23b90 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
23ba0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
23bb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23bc0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
23bd0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
23be0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
23bf0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
23c00 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
23c10 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
23c20 20 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61   int a[2];.  cha
23c30 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  r z[100];..  if(
23c40 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
23c50 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
23c60 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
23c70 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
23c80 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
23c90 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
23ca0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
23cb0 20 22 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c   " DB NRETRY DEL
23cc0 41 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  AY", 0);.    ret
23cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23ce0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
23cf0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
23d00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
23d10 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
23d20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23d30 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
23d40 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
23d50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
23d60 20 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e   &a[0]) ) return
23d70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
23d80 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
23d90 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
23da0 5b 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65  [3], &a[1]) ) re
23db0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
23dd0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
23de0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
23df0 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
23e00 59 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20  Y, (void*)a);.  
23e10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23e20 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
23e30 25 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61  %d %d %d", rc, a
23e40 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63  [0], a[1]);.  Tc
23e50 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23e60 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a  nterp, z, (char*
23e70 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
23e80 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
23e90 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
23ea0 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
23eb0 77 61 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46  wal DB PERSIST-F
23ec0 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LAG.**.** This T
23ed0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
23ee0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
23ef0 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
23f00 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
23f10 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
23f20 49 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a  IST_WAL opcode..
23f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
23f40 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69  le_control_persi
23f50 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74  st_wal(.  Client
23f60 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
23f70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
23f80 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
23f90 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
23fa0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23fb0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23fc0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23fd0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23fe0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23ff0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
24000 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24010 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
24020 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
24030 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
24040 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
24050 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
24060 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
24070 20 62 50 65 72 73 69 73 74 3b 0a 20 20 63 68 61   bPersist;.  cha
24080 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  r z[100];..  if(
24090 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
240a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
240b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
240c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
240d0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
240e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
240f0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
24100 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b   " DB FLAG", 0);
24110 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24120 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
24130 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
24140 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
24150 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
24160 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
24170 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24180 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
24190 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
241a0 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73 69  objv[2], &bPersi
241b0 73 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  st) ) return TCL
241c0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
241d0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
241e0 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
241f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
24200 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26  ST_WAL, (void*)&
24210 62 50 65 72 73 69 73 74 29 3b 0a 20 20 73 71 6c  bPersist);.  sql
24220 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
24230 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
24240 25 64 22 2c 20 72 63 2c 20 62 50 65 72 73 69 73  %d", rc, bPersis
24250 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  t);.  Tcl_Append
24260 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
24270 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
24280 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
24290 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
242a0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
242b0 5f 76 66 73 6e 61 6d 65 20 44 42 20 3f 41 55 58  _vfsname DB ?AUX
242c0 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  DB?.**.** Return
242d0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
242e0 65 73 63 72 69 62 65 73 20 74 68 65 20 73 74 61  escribes the sta
242f0 63 6b 20 6f 66 20 56 46 53 65 73 2e 0a 2a 2f 0a  ck of VFSes..*/.
24300 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
24310 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 28  control_vfsname(
24320 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
24330 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
24340 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
24350 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
24360 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
24370 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
24380 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
24390 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
243a0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
243b0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
243d0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
243e0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
243f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
24400 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24410 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
24420 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
24430 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
24440 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72  = "main";.  char
24450 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a   *zVfsName = 0;.
24460 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26  .  if( objc!=2 &
24470 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
24480 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
24490 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
244a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
244b0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
244c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
244d0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
244e0 2c 20 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c  , " DB ?AUXDB?",
244f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
24500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
24510 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
24520 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
24530 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
24540 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
24550 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24560 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
24570 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65  3 ){.    zDbName
24580 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
24590 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20  (objv[2]);.  }. 
245a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
245b0 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d  ntrol(db, zDbNam
245c0 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
245d0 56 46 53 4e 41 4d 45 2c 28 76 6f 69 64 2a 29 26  VFSNAME,(void*)&
245e0 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 54 63 6c  zVfsName);.  Tcl
245f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24600 74 65 72 70 2c 20 7a 56 66 73 4e 61 6d 65 2c 20  terp, zVfsName, 
24610 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c  (char*)0);.  sql
24620 69 74 65 33 5f 66 72 65 65 28 7a 56 66 73 4e 61  ite3_free(zVfsNa
24630 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  me);.  return TC
24640 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  L_OK;  .}.../*.*
24650 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69  * tclcmd:   sqli
24660 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a  te3_vfs_list.**.
24670 2a 2a 20 20 20 52 65 74 75 72 6e 20 61 20 74 63  **   Return a tc
24680 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  l list containin
24690 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  g the names of a
246a0 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20 76 66  ll registered vf
246b0 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s's..*/.static i
246c0 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43  nt vfs_list(.  C
246d0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
246e0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
246f0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
24700 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
24710 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
24720 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
24730 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24740 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
24750 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
24760 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
24770 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24780 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
24790 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
247a0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
247b0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
247c0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
247d0 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63  _vfs *pVfs;.  Tc
247e0 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63  l_Obj *pRet = Tc
247f0 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66  l_NewObj();.  if
24800 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
24810 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
24820 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
24830 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
24840 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24850 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c  }.  for(pVfs=sql
24860 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
24870 3b 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66  ; pVfs; pVfs=pVf
24880 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54  s->pNext){.    T
24890 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
248a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
248b0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
248c0 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61  ingObj(pVfs->zNa
248d0 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  me, -1));.  }.  
248e0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
248f0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
24900 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
24910 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
24920 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69  md:   sqlite3_li
24930 6d 69 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a  mit DB ID VALUE.
24940 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
24950 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
24960 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e  sqlite3_limit in
24970 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
24980 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
24990 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
249a0 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
249b0 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74 28   int test_limit(
249c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
249d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
249e0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
249f0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
24a00 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
24a10 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
24a20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
24a30 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
24a40 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
24a50 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a70 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
24a80 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
24a90 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
24aa0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24ab0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
24ac0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
24ad0 72 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  rc;.  static con
24ae0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
24af0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
24b00 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61     int id;.  } a
24b10 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  Id[] = {.    { "
24b20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
24b30 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  GTH",           
24b40 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
24b50 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
24b60 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
24b70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
24b80 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
24b90 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53    SQLITE_LIMIT_S
24ba0 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  QL_LENGTH       
24bb0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
24bc0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
24bd0 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  N",             
24be0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
24bf0 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20  LUMN            
24c00 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
24c10 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
24c20 45 50 54 48 22 2c 20 20 20 20 20 20 20 20 20 20  EPTH",          
24c30 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
24c40 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20  R_DEPTH         
24c50 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
24c60 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
24c70 44 5f 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53  D_SELECT",     S
24c80 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
24c90 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20  OUND_SELECT     
24ca0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
24cb0 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22  E_LIMIT_VDBE_OP"
24cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
24cd0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
24ce0 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OP              
24cf0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
24d00 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
24d10 41 52 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c  ARG",        SQL
24d20 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
24d30 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d  ON_ARG         }
24d40 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
24d50 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c  LIMIT_ATTACHED",
24d60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
24d70 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
24d80 44 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  D             },
24d90 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
24da0 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
24db0 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54  N_LENGTH", SQLIT
24dc0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
24dd0 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a  TERN_LENGTH  },.
24de0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
24df0 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
24e00 42 45 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45  BER",     SQLITE
24e10 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
24e20 4e 55 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20  NUMBER      },. 
24e30 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
24e40 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
24e50 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
24e60 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
24e70 50 54 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  PTH        },.  
24e80 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66    .    /* Out of
24e90 20 72 61 6e 67 65 20 74 65 73 74 20 63 61 73 65   range test case
24ea0 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49  s */.    { "SQLI
24eb0 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c  TE_LIMIT_TOOSMAL
24ec0 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d  L",            -
24ed0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
24f00 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c  E_LIMIT_TOOBIG",
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
24f20 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
24f30 45 52 5f 44 45 50 54 48 2b 31 20 20 20 20 20 20  ER_DEPTH+1      
24f40 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
24f50 20 69 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a   id;.  int val;.
24f60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
24f70 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  d;..  if( objc!=
24f80 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
24f90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24fa0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24fb0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
24fc0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
24fd0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
24fe0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49  v[0], 0), " DB I
24ff0 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  D VALUE", 0);.  
25000 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
25010 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
25020 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
25030 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
25040 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
25050 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
25060 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f  OR;.  zId = Tcl_
25070 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
25080 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
25090 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  <sizeof(aId)/siz
250a0 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b  eof(aId[0]); i++
250b0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
250c0 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e  p(zId, aId[i].zN
250d0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
250e0 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b   id = aId[i].id;
250f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25100 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
25110 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  =sizeof(aId)/siz
25120 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20  eof(aId[0]) ){. 
25130 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
25140 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
25150 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a  nown limit type:
25160 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29   ", zId, (char*)
25170 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
25180 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25190 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
251a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
251b0 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
251c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
251d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
251e0 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61  limit(db, id, va
251f0 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
25200 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
25210 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
25220 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
25230 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
25240 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e  clcmd:  save_prn
25250 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61  g_state.**.** Sa
25260 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
25270 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f  the pseudo-rando
25280 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
25290 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61  or..** At the sa
252a0 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20  me time, verify 
252b0 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73  that sqlite3_tes
252c0 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20  t_control works 
252d0 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c  even when.** cal
252e0 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d  led with an out-
252f0 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e  of-range opcode.
25300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
25310 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ave_prng_state(.
25320 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25330 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25340 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25350 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25360 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25370 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25380 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25390 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
253a0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
253b0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
253d0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
253e0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
253f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25400 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25410 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
25420 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
25430 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b  t_control(9999);
25440 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
25450 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
25460 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
25470 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  -1);.  assert( r
25480 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c==0 );.  sqlite
25490 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
254a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
254b0 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74  RNG_SAVE);.  ret
254c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
254d0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73  .** tclcmd:  res
254e0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a  tore_prng_state.
254f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
25500 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
25510 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
25520 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
25530 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
25540 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
25550 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25560 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25570 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25580 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25590 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
255a0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
255b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
255c0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
255d0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
255e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
255f0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
25600 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
25610 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
25620 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
25630 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29  RL_PRNG_RESTORE)
25640 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
25650 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
25660 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73  d:  reset_prng_s
25670 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
25680 6e 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  nt reset_prng_st
25690 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
256a0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
256b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
256c0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
256d0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
256e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
256f0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25700 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25710 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25720 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25730 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25750 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25760 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25770 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25780 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25790 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
257a0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
257b0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
257c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
257d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
257e0 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61  cmd:  pcache_sta
257f0 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
25800 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
25810 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ts(.  ClientData
25820 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
25830 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
25840 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
25850 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
25860 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
25870 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
25880 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
25890 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
258a0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
258b0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
258c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
258d0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
258e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
258f0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
25900 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
25910 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20  int nMin;.  int 
25920 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72  nMax;.  int nCur
25930 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rent;.  int nRec
25940 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f  yclable;.  Tcl_O
25950 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c  bj *pRet;..  sql
25960 69 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28  ite3PcacheStats(
25970 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78  &nCurrent, &nMax
25980 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63  , &nMin, &nRecyc
25990 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20  lable);..  pRet 
259a0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
259b0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
259c0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
259d0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
259e0 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65  StringObj("curre
259f0 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  nt", -1));.  Tcl
25a00 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
25a10 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
25a20 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
25a30 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20  j(nCurrent));.  
25a40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
25a50 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
25a60 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
25a70 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d  ringObj("max", -
25a80 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
25a90 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
25aa0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
25ab0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78  l_NewIntObj(nMax
25ac0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
25ad0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
25ae0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
25af0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
25b00 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  in", -1));.  Tcl
25b10 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
25b20 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
25b30 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
25b40 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f  j(nMin));.  Tcl_
25b50 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
25b60 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
25b70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
25b80 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22  Obj("recyclable"
25b90 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
25ba0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
25bb0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
25bc0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
25bd0 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20  Recyclable));.. 
25be0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
25bf0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
25c00 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
25c10 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
25c20 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
25c30 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20  K_NOTIFY.static 
25c40 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  void test_unlock
25c50 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20  _notify_cb(void 
25c60 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  **aArg, int nArg
25c70 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66  ){.  int ii;.  f
25c80 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67  or(ii=0; ii<nArg
25c90 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ; ii++){.    Tcl
25ca0 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74  _EvalEx((Tcl_Int
25cb0 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20  erp *)aArg[ii], 
25cc0 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  "unlock_notify",
25cd0 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
25ce0 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  OBAL);.  }.}.#en
25cf0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
25d00 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
25d10 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  FY */../*.** tcl
25d20 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e  cmd:  sqlite3_un
25d30 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a  lock_notify db.*
25d40 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
25d50 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
25d60 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20  TIFY.static int 
25d70 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  test_unlock_noti
25d80 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  fy(.  ClientData
25d90 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
25da0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
25db0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
25dc0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
25dd0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
25de0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
25df0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
25e00 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
25e10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
25e20 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
25e30 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
25e40 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
25e50 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
25e60 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
25e70 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
25e80 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
25e90 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
25ea0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
25eb0 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
25ec0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25ed0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
25ee0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
25ef0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
25f00 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
25f10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25f20 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
25f30 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
25f40 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f  fy(db, test_unlo
25f50 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76  ck_notify_cb, (v
25f60 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20  oid *)interp);. 
25f70 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
25f80 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
25f90 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
25fa0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
25fb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
25fc0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
25fd0 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77  lcmd:  sqlite3_w
25fe0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
25ff0 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69   ?NAME?.*/.stati
26000 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63  c int test_wal_c
26010 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69  heckpoint(.  Cli
26020 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
26030 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
26040 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
26050 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
26060 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
26070 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
26080 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
26090 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
260a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
260b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
260c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
260d0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
260e0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
260f0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
26100 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
26110 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
26120 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
26130 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
26140 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
26150 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
26160 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a  , "DB ?NAME?");.
26170 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
26180 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
26190 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
261a0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
261b0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
261c0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
261d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
261e0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
261f0 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
26200 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
26210 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
26220 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
26230 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
26240 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
26250 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
26260 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
26270 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
26280 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
26290 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
262a0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
262b0 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44  kpoint_v2 db MOD
262c0 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54  E ?NAME?.**.** T
262d0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c  his command call
262e0 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70  s the wal_checkp
262f0 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69  oint_v2() functi
26300 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63  on with the spec
26310 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72  ified.** mode ar
26320 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c  gument (passive,
26330 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74   full or restart
26340 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74  ). If present, t
26350 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
26360 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73  .** NAME is pass
26370 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
26380 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c   argument to wal
26390 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
263a0 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e  . If it the.** N
263b0 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20  AME argument is 
263c0 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e  not present, a N
263d0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70  ULL pointer is p
263e0 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  assed instead..*
263f0 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63  *.** If wal_chec
26400 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75  kpoint_v2() retu
26410 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74  rns any value ot
26420 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
26430 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  BUSY or.** SQLIT
26440 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20  E_OK, then this 
26450 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
26460 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54  TCL_ERROR. The T
26470 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74  cl result is set
26480 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72  .** to the error
26490 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65   message obtaine
264a0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  d from sqlite3_e
264b0 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f  rrmsg()..**.** O
264c0 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63  therwise, this c
264d0 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61  ommand returns a
264e0 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69   list of three i
264f0 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72  ntegers. The fir
26500 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73  st integer.** is
26510 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53   1 if SQLITE_BUS
26520 59 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20  Y was returned, 
26530 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
26540 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
26550 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72  o integers.** ar
26560 65 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74  e the values ret
26570 75 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75  urned via the ou
26580 74 70 75 74 20 70 61 72 61 6d 61 74 65 72 73 20  tput paramaters 
26590 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  by wal_checkpoin
265a0 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20  t_v2() -.** the 
265b0 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
265c0 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20   in the log and 
265d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
265e0 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a  ames in the log.
265f0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ** that have bee
26600 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  n checkpointed..
26610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
26620 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
26630 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  t_v2(.  ClientDa
26640 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
26650 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
26660 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
26670 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
26680 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
26690 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
266a0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
266b0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
266c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
266d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
266e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
266f0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
26700 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26710 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
26720 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
26730 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74    int rc;..  int
26740 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c   eMode;.  int nL
26750 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74  og = -555;.  int
26760 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20   nCkpt = -555;. 
26770 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
26780 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  .  const char * 
26790 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73  aMode[] = { "pas
267a0 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22  sive", "full", "
267b0 72 65 73 74 61 72 74 22 2c 20 30 20 7d 3b 0a 20  restart", 0 };. 
267c0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
267d0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
267e0 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  VE==0 );.  asser
267f0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
26800 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a  OINT_FULL==1 );.
26810 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
26820 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
26830 41 52 54 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28  ART==2 );..  if(
26840 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
26850 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
26860 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
26870 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
26880 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a   MODE ?NAME?");.
26890 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
268a0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
268b0 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
268c0 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
268d0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
268e0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
268f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
26900 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
26910 31 5d 29 2c 20 26 64 62 29 0a 20 20 20 7c 7c 20  1]), &db).   || 
26920 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
26930 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
26940 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64  [2], aMode, "mod
26950 65 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a  e", 0, &eMode) .
26960 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
26970 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
26980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
26990 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
269a0 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c  (db, zDb, eMode,
269b0 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b   &nLog, &nCkpt);
269c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
269d0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
269e0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 54  TE_BUSY ){.    T
269f0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
26a00 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
26a10 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
26a20 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
26a30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
26a40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
26a50 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
26a60 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
26a70 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26a80 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
26a90 65 77 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c  ewIntObj(rc==SQL
26aa0 49 54 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a  ITE_BUSY?1:0));.
26ab0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
26ac0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
26ad0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
26ae0 49 6e 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20  IntObj(nLog));. 
26af0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
26b00 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
26b10 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
26b20 6e 74 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20  ntObj(nCkpt));. 
26b30 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
26b40 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
26b50 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
26b60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
26b70 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65  md:  test_sqlite
26b80 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a  3_log ?SCRIPT?.*
26b90 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
26ba0 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20  LogCallback {.  
26bb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74  Tcl_Interp *pInt
26bc0 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
26bd0 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62  pObj;.} logcallb
26be0 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74  ack = {0, 0};.st
26bf0 61 74 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61  atic void xLogca
26c00 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75  llback(void *unu
26c10 73 65 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68  sed, int err, ch
26c20 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c  ar *zMsg){.  Tcl
26c30 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c  _Obj *pNew = Tcl
26c40 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f  _DuplicateObj(lo
26c50 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b  gcallback.pObj);
26c60 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
26c70 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c  unt(pNew);.  Tcl
26c80 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26c90 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20  ement(.      0, 
26ca0 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pNew, Tcl_NewStr
26cb0 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 54 65  ingObj(sqlite3Te
26cc0 73 74 45 72 72 6f 72 4e 61 6d 65 28 65 72 72 29  stErrorName(err)
26cd0 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c  , -1).  );.  Tcl
26ce0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26cf0 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54  ement(0, pNew, T
26d00 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
26d10 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zMsg, -1));.  Tc
26d20 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63  l_EvalObjEx(logc
26d30 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c  allback.pInterp,
26d40 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f   pNew, TCL_EVAL_
26d50 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f  GLOBAL|TCL_EVAL_
26d60 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44  DIRECT);.  Tcl_D
26d70 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77  ecrRefCount(pNew
26d80 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
26d90 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67  test_sqlite3_log
26da0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26db0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
26dc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26dd0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26de0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26df0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26e00 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
26e10 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
26e20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26e30 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26e40 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
26e50 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
26e60 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26e70 20 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20   if( objc>2 ){. 
26e80 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
26e90 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
26ea0 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a  bjv, "SCRIPT");.
26eb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
26ec0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
26ed0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
26ee0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
26ef0 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c  RefCount(logcall
26f00 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20  back.pObj);.    
26f10 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
26f20 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c   = 0;.    logcal
26f30 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20  lback.pInterp = 
26f40 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  0;.    sqlite3_c
26f50 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
26f60 46 49 47 5f 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a  FIG_LOG, 0, 0);.
26f70 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31    }.  if( objc>1
26f80 20 29 7b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62   ){.    logcallb
26f90 61 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b  ack.pObj = objv[
26fa0 31 5d 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  1];.    Tcl_Incr
26fb0 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c  RefCount(logcall
26fc0 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20  back.pObj);.    
26fd0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74  logcallback.pInt
26fe0 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
26ff0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
27000 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c  (SQLITE_CONFIG_L
27010 4f 47 2c 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b  OG, xLogcallback
27020 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
27030 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
27040 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70  .**     tcl_objp
27050 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20  roc COMMANDNAME 
27060 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75  ARGS....**.** Ru
27070 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  n a TCL command 
27080 75 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f  using its objPro
27090 63 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68  c interface.  Th
270a0 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a  row an error if.
270b0 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68  ** the command h
270c0 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e  as no objProc in
270d0 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
270e0 69 63 20 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50  ic int runAsObjP
270f0 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  roc(.  void * cl
27100 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
27110 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
27120 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
27130 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27140 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64  v[].){.  Tcl_Cmd
27150 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
27160 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
27170 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
27180 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
27190 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e  jv, "COMMAND ...
271a0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
271b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
271c0 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
271d0 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
271e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
271f0 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f  jv[1]), &cmdInfo
27200 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
27210 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27220 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66  , "command not f
27230 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  ound: ",.       
27240 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
27250 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
27260 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
27270 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
27280 0a 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f  .  if( cmdInfo.o
27290 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  bjProc==0 ){.   
272a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
272b0 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
272c0 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f  nd has no objPro
272d0 63 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c: ",.          
272e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
272f0 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
27300 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
27310 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27320 72 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f  return cmdInfo.o
27330 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f  bjProc(cmdInfo.o
27340 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  bjClientData, in
27350 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62  terp, objc-1, ob
27360 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  jv+1);.}..#ifnde
27370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
27380 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e  PLAIN./*.** WARN
27390 49 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ING: The followi
273a0 6e 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69  ng function, pri
273b0 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ntExplainQueryPl
273c0 61 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63 74  an() is an exact
273d0 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d  .** copy of exam
273e0 70 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71  ple code from eq
273f0 70 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e  p.in (eqp.html).
27400 20 49 66 20 74 68 69 73 20 63 6f 64 65 20 69 73   If this code is
27410 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68   modified,.** th
27420 65 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61  en the documenta
27430 74 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20  tion copy needs 
27440 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61  to be modified a
27450 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  s well..*/./*.**
27460 20 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20   Argument pStmt 
27470 69 73 20 61 20 70 72 65 70 61 72 65 64 20 53 51  is a prepared SQ
27480 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  L statement. Thi
27490 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69  s function compi
274a0 6c 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49  les.** an EXPLAI
274b0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d  N QUERY PLAN com
274c0 6d 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f  mand to report o
274d0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
274e0 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64  tatement,.** and
274f0 20 70 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f   prints the repo
27500 72 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69  rt to stdout usi
27510 6e 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a  ng printf()..*/.
27520 69 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e  int printExplain
27530 51 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65  QueryPlan(sqlite
27540 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a  3_stmt *pStmt){.
27550 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
27560 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
27570 20 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a    /* Input SQL *
27580 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61  /.  char *zExpla
27590 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
275a0 20 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20      /* SQL with 
275b0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
275c0 41 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a  AN prepended */.
275d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
275e0 70 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20  pExplain;       
275f0 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58    /* Compiled EX
27600 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
27610 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
27620 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27640 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
27650 6d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  m sqlite3_prepar
27660 65 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71  e_v2() */..  zSq
27670 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
27680 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53  pStmt);.  if( zS
27690 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ql==0 ) return S
276a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
276b0 7a 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74  zExplain = sqlit
276c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c  e3_mprintf("EXPL
276d0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25  AIN QUERY PLAN %
276e0 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28  s", zSql);.  if(
276f0 20 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72   zExplain==0 ) r
27700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
27710 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  EM;..  rc = sqli
27720 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73  te3_prepare_v2(s
27730 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
27740 28 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69  (pStmt), zExplai
27750 6e 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  n, -1, &pExplain
27760 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
27770 66 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a  free(zExplain);.
27780 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27790 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
277a0 0a 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  ..  while( SQLIT
277b0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
277c0 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b  tep(pExplain) ){
277d0 0a 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74  .    int iSelect
277e0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
277f0 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
27800 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f  , 0);.    int iO
27810 72 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  rder = sqlite3_c
27820 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
27830 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  in, 1);.    int 
27840 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f  iFrom = sqlite3_
27850 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
27860 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e  ain, 2);.    con
27870 73 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c  st char *zDetail
27880 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
27890 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
278a0 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
278b0 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22  );..    printf("
278c0 25 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20  %d %d %d %s\n", 
278d0 69 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65  iSelectid, iOrde
278e0 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69  r, iFrom, zDetai
278f0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  l);.  }..  retur
27900 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  n sqlite3_finali
27910 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a  ze(pExplain);.}.
27920 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
27930 5f 70 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f  _print_eqp(.  vo
27940 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
27950 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27960 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
27970 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
27980 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
27990 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
279a0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
279b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
279c0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
279d0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
279e0 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
279f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27a00 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
27a10 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
27a20 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
27a30 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
27a40 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
27a50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
27a60 3d 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75  = printExplainQu
27a70 65 72 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a  eryPlan(pStmt);.
27a80 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 65 65    /* This is nee
27a90 64 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73  ded on Windows s
27aa0 6f 20 74 68 61 74 20 61 20 74 65 73 74 20 63 61  o that a test ca
27ab0 73 65 20 75 73 69 6e 67 20 74 68 69 73 20 0a 20  se using this . 
27ac0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e   ** function can
27ad0 20 6f 70 65 6e 20 61 20 72 65 61 64 20 70 69 70   open a read pip
27ae0 65 20 61 6e 64 20 67 65 74 20 74 68 65 20 6f 75  e and get the ou
27af0 74 70 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69  tput of.  ** pri
27b00 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ntExplainQueryPl
27b10 61 6e 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79  an() immediately
27b20 2e 0a 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28  ..  */.  fflush(
27b30 73 74 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53  stdout);.  Tcl_S
27b40 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
27b50 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
27b60 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
27b70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
27b80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
27b90 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
27ba0 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  /../*.** sqlite3
27bb0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45  _test_control VE
27bc0 52 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74  RB ARGS....*/.st
27bd0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 65  atic int test_te
27be0 73 74 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f  st_control(.  vo
27bf0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
27c00 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27c10 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
27c20 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
27c30 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
27c40 73 74 72 75 63 74 20 56 65 72 62 20 7b 0a 20 20  struct Verb {.  
27c50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
27c60 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ame;.    int i;.
27c70 20 20 7d 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a    } aVerb[] = {.
27c80 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45      { "SQLITE_TE
27c90 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
27ca0 5f 46 41 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f  _FAULT", SQLITE_
27cb0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
27cc0 4d 45 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20 7d  ME_FAULT }, .  }
27cd0 3b 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20  ;.  int iVerb;. 
27ce0 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e   int iFlag;.  in
27cf0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
27d00 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
27d10 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
27d20 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45  rp, 1, objv, "VE
27d30 52 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20  RB ARGS...");.  
27d40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27d50 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OR;.  }..  rc = 
27d60 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
27d70 4f 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20  ObjStruct(.     
27d80 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d   interp, objv[1]
27d90 2c 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28  , aVerb, sizeof(
27da0 61 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42  aVerb[0]), "VERB
27db0 22 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29  ", 0, &iVerb.  )
27dc0 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
27dd0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
27de0 0a 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62  .  iFlag = aVerb
27df0 5b 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69  [iVerb].i;.  swi
27e00 74 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20  tch( iFlag ){.  
27e10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
27e20 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
27e30 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20  _FAULT: {.      
27e40 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69  int val;.      i
27e50 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
27e60 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
27e70 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
27e80 2c 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29  , objv, "ONOFF")
27e90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
27ea0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
27eb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 54 63    }.      if( Tc
27ec0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
27ed0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
27ee0 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
27ef0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27f00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
27f10 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
27f20 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
27f30 49 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b  IME_FAULT, val);
27f40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27f50 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52    }.  }..  Tcl_R
27f60 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
27f70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
27f80 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
27f90 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  TE_OS_WIN./*.** 
27fa0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  Information pass
27fb0 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
27fc0 20 74 68 72 65 61 64 20 69 6e 74 6f 20 74 68 65   thread into the
27fd0 20 77 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f   windows file lo
27fe0 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75  cker.** backgrou
27ff0 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74  nd thread..*/.st
28000 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
28010 63 6b 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 65  cker {.  char *e
28020 76 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20  vName;       /* 
28030 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74 20 74 6f  Name of event to
28040 20 73 69 67 6e 61 6c 20 74 68 72 65 61 64 20 73   signal thread s
28050 74 61 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44  tartup */.  HAND
28060 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  LE h;           
28070 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20 74 68 65  /* Handle of the
28080 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
28090 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61  ed */.  int dela
280a0 79 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  y1;         /* D
280b0 65 6c 61 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b  elay before lock
280c0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ing */.  int del
280d0 61 79 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ay2;         /* 
280e0 44 65 6c 61 79 20 62 65 66 6f 72 65 20 75 6e 6c  Delay before unl
280f0 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  ocking */.  int 
28100 6f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ok;             
28110 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a  /* Finished ok *
28120 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20 20 20 20  /.  int err;    
28130 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28140 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
28150 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a  rs */.};.#endif.
28160 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
28170 57 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61  WIN./*.** The ba
28180 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20  ckground thread 
28190 74 68 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c  that does file l
281a0 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ocking..*/.stati
281b0 63 20 76 6f 69 64 20 77 69 6e 33 32 5f 66 69 6c  c void win32_fil
281c0 65 5f 6c 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70  e_locker(void *p
281d0 41 70 70 44 61 74 61 29 7b 0a 20 20 73 74 72 75  AppData){.  stru
281e0 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b  ct win32FileLock
281f0 65 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  er *p = (struct 
28200 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a  win32FileLocker*
28210 29 70 41 70 70 44 61 74 61 3b 0a 20 20 69 66 28  )pAppData;.  if(
28220 20 70 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20   p->evName ){.  
28230 20 20 48 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70    HANDLE ev = Op
28240 65 6e 45 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f  enEvent(EVENT_MO
28250 44 49 46 59 5f 53 54 41 54 45 2c 20 46 41 4c 53  DIFY_STATE, FALS
28260 45 2c 20 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20  E, p->evName);. 
28270 20 20 20 69 66 20 28 20 65 76 20 29 7b 0a 20 20     if ( ev ){.  
28280 20 20 20 20 53 65 74 45 76 65 6e 74 28 65 76 29      SetEvent(ev)
28290 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e  ;.      CloseHan
282a0 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20  dle(ev);.    }. 
282b0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64 65 6c 61   }.  if( p->dela
282c0 79 31 20 29 20 53 6c 65 65 70 28 70 2d 3e 64 65  y1 ) Sleep(p->de
282d0 6c 61 79 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63  lay1);.  if( Loc
282e0 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30  kFile(p->h, 0, 0
282f0 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 20  , 100000000, 0) 
28300 29 7b 0a 20 20 20 20 53 6c 65 65 70 28 70 2d 3e  ){.    Sleep(p->
28310 64 65 6c 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c  delay2);.    Unl
28320 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c  ockFile(p->h, 0,
28330 20 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30   0, 100000000, 0
28340 29 3b 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31  );.    p->ok = 1
28350 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
28360 2d 3e 65 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20  ->err = 1;.  }. 
28370 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e   CloseHandle(p->
28380 68 29 3b 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a  h);.  p->h = 0;.
28390 20 20 70 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b    p->delay1 = 0;
283a0 0a 20 20 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30  .  p->delay2 = 0
283b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
283c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a  SQLITE_OS_WIN./*
283d0 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69  .**      lock_wi
283e0 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d  n32_file FILENAM
283f0 45 20 44 45 4c 41 59 31 20 44 45 4c 41 59 32 0a  E DELAY1 DELAY2.
28400 2a 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 65 78 63  **.** Get an exc
28410 6c 75 73 69 76 65 20 6d 61 6e 64 69 74 6f 72 79  lusive manditory
28420 20 6c 6f 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f   lock on file fo
28430 72 20 44 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65  r DELAY2 millise
28440 63 6f 6e 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44  conds..** Wait D
28450 45 4c 41 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e  ELAY1 millisecon
28460 64 73 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ds before acquir
28470 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f  ing the lock..*/
28480 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
28490 32 5f 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76  2_file_lock(.  v
284a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
284b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
284c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
284d0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
284e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
284f0 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77   static struct w
28500 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78  in32FileLocker x
28510 20 3d 20 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65   = { "win32_file
28520 5f 6c 6f 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c  _lock", 0, 0, 0,
28530 20 30 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74   0, 0 };.  const
28540 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
28550 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  ;.  char zBuf[20
28560 30 5d 3b 0a 20 20 69 6e 74 20 72 65 74 72 79 20  0];.  int retry 
28570 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76  = 0;.  HANDLE ev
28580 3b 0a 20 20 44 57 4f 52 44 20 77 52 65 73 75 6c  ;.  DWORD wResul
28590 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  t;.  .  if( objc
285a0 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 31 20 29  !=4 && objc!=1 )
285b0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
285c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
285d0 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d  , objv, "FILENAM
285e0 45 20 44 45 4c 41 59 31 20 44 45 4c 41 59 32 22  E DELAY1 DELAY2"
285f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28600 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
28610 66 28 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20  f( objc==1 ){.  
28620 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
28630 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
28640 20 7a 42 75 66 2c 20 22 25 64 20 25 64 20 25 64   zBuf, "%d %d %d
28650 20 25 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20   %d %d",.       
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 2e                x.
28670 6f 6b 2c 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c  ok, x.err, x.del
28680 61 79 31 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78  ay1, x.delay2, x
28690 2e 68 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  .h);.    Tcl_App
286a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
286b0 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
286c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
286d0 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  L_OK;.  }.  whil
286e0 65 28 20 78 2e 68 20 26 26 20 72 65 74 72 79 3c  e( x.h && retry<
286f0 33 30 20 29 7b 0a 20 20 20 20 72 65 74 72 79 2b  30 ){.    retry+
28700 2b 3b 0a 20 20 20 20 53 6c 65 65 70 28 31 30 30  +;.    Sleep(100
28710 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 68  );.  }.  if( x.h
28720 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
28730 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
28740 20 22 62 75 73 79 22 2c 20 28 63 68 61 72 2a 29   "busy", (char*)
28750 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
28760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
28770 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
28780 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
28790 6a 76 5b 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31  jv[2], &x.delay1
287a0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
287b0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
287c0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
287d0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
287e0 78 2e 64 65 6c 61 79 32 29 20 29 20 72 65 74 75  x.delay2) ) retu
287f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28800 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f  zFilename = Tcl_
28810 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28820 5d 29 3b 0a 20 20 78 2e 68 20 3d 20 43 72 65 61  ]);.  x.h = Crea
28830 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65  teFile(zFilename
28840 2c 20 47 45 4e 45 52 49 43 5f 52 45 41 44 7c 47  , GENERIC_READ|G
28850 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20  ENERIC_WRITE,.  
28860 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45              FILE
28870 5f 53 48 41 52 45 5f 52 45 41 44 7c 46 49 4c 45  _SHARE_READ|FILE
28880 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 20 30 2c  _SHARE_WRITE, 0,
28890 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20   OPEN_ALWAYS,.  
288a0 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45              FILE
288b0 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
288c0 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 78 2e  L, 0);.  if( !x.
288d0 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  h ){.    Tcl_App
288e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
288f0 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  , "cannot open f
28900 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d  ile: ", zFilenam
28910 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
28920 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28930 4f 52 3b 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43  OR;.  }.  ev = C
28940 72 65 61 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c  reateEvent(NULL,
28950 20 54 52 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e   TRUE, FALSE, x.
28960 65 76 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 20  evName);.  if ( 
28970 21 65 76 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !ev ){.    Tcl_A
28980 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28990 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61  rp, "cannot crea
289a0 74 65 20 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65  te event: ", x.e
289b0 76 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  vName, (char*)0)
289c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
289d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62  _ERROR;.  }.  _b
289e0 65 67 69 6e 74 68 72 65 61 64 28 77 69 6e 33 32  eginthread(win32
289f0 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c  _file_locker, 0,
28a00 20 28 76 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53   (void*)&x);.  S
28a10 6c 65 65 70 28 30 29 3b 0a 20 20 69 66 20 28 20  leep(0);.  if ( 
28a20 28 77 52 65 73 75 6c 74 20 3d 20 57 61 69 74 46  (wResult = WaitF
28a30 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65  orSingleObject(e
28a40 76 2c 20 31 30 30 30 30 29 29 21 3d 57 41 49 54  v, 10000))!=WAIT
28a50 5f 4f 42 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20  _OBJECT_0 ){.   
28a60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
28a70 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
28a80 7a 42 75 66 2c 20 22 30 78 25 78 22 2c 20 77 52  zBuf, "0x%x", wR
28a90 65 73 75 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f  esult);.    Tcl_
28aa0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
28ab0 65 72 70 2c 20 22 77 61 69 74 20 66 61 69 6c 65  erp, "wait faile
28ac0 64 3a 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61  d: ", zBuf, (cha
28ad0 72 2a 29 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65  r*)0);.    Close
28ae0 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20  Handle(ev);.    
28af0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28b00 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e  ;.  }.  CloseHan
28b10 64 6c 65 28 65 76 29 3b 0a 20 20 72 65 74 75 72  dle(ev);.  retur
28b20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
28b30 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  if.../*.**      
28b40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
28b50 74 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c  trol DB OPT BOOL
28b60 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65  EAN.**.** Enable
28b70 20 6f 72 20 64 69 73 61 62 6c 65 20 71 75 65 72   or disable quer
28b80 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  y optimizations 
28b90 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
28ba0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29  3_test_control()
28bb0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20  .** interface.  
28bc0 44 69 73 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45  Disable if BOOLE
28bd0 41 4e 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  AN is false and 
28be0 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41  enable if BOOLEA
28bf0 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50  N is true..** OP
28c00 54 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  T is the name of
28c10 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
28c20 6e 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  n to be disabled
28c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28c40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
28c50 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  trol(.  void * c
28c60 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
28c70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28c80 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
28c90 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28ca0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
28cb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
28cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
28cd0 70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b  pt;.  int onoff;
28ce0 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 73  .  int mask;.  s
28cf0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
28d00 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
28d10 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20  har *zOptName;. 
28d20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d     int mask;.  }
28d30 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20   aOpt[] = {.    
28d40 7b 20 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  { "all",        
28d50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 70 74        SQLITE_Opt
28d60 4d 61 73 6b 20 20 20 20 20 20 20 20 7d 2c 0a 20  Mask        },. 
28d70 20 20 20 7b 20 22 71 75 65 72 79 2d 66 6c 61 74     { "query-flat
28d80 74 65 6e 65 72 22 2c 20 20 53 51 4c 49 54 45 5f  tener",  SQLITE_
28d90 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20 7d  QueryFlattener }
28da0 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d  ,.    { "column-
28db0 63 61 63 68 65 22 2c 20 20 20 20 20 53 51 4c 49  cache",     SQLI
28dc0 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 20  TE_ColumnCache  
28dd0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 64 65    },.    { "inde
28de0 78 2d 73 6f 72 74 22 2c 20 20 20 20 20 20 20 53  x-sort",       S
28df0 51 4c 49 54 45 5f 49 6e 64 65 78 53 6f 72 74 20  QLITE_IndexSort 
28e00 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69       },.    { "i
28e10 6e 64 65 78 2d 73 65 61 72 63 68 22 2c 20 20 20  ndex-search",   
28e20 20 20 53 51 4c 49 54 45 5f 49 6e 64 65 78 53 65    SQLITE_IndexSe
28e30 61 72 63 68 20 20 20 20 7d 2c 0a 20 20 20 20 7b  arch    },.    {
28e40 20 22 69 6e 64 65 78 2d 63 6f 76 65 72 22 2c 20   "index-cover", 
28e50 20 20 20 20 20 53 51 4c 49 54 45 5f 49 6e 64 65       SQLITE_Inde
28e60 78 43 6f 76 65 72 20 20 20 20 20 7d 2c 0a 20 20  xCover     },.  
28e70 20 20 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72 64    { "groupby-ord
28e80 65 72 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 47  er",    SQLITE_G
28e90 72 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d 2c  roupByOrder   },
28ea0 0a 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d 63  .    { "factor-c
28eb0 6f 6e 73 74 61 6e 74 73 22 2c 20 53 51 4c 49 54  onstants", SQLIT
28ec0 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
28ed0 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 61 6c 2d   },.    { "real-
28ee0 61 73 2d 69 6e 74 22 2c 20 20 20 20 20 20 53 51  as-int",      SQ
28ef0 4c 49 54 45 5f 49 64 78 52 65 61 6c 41 73 49 6e  LITE_IdxRealAsIn
28f00 74 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69  t   },.  };..  i
28f10 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
28f20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
28f30 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
28f40 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c  jv, "DB OPT BOOL
28f50 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
28f60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28f70 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
28f80 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
28f90 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28fa0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
28fb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
28fc0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
28fd0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
28fe0 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66   objv[3], &onoff
28ff0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
29000 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54  RROR;.  zOpt = T
29010 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
29020 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
29030 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29  ; i<sizeof(aOpt)
29040 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
29050 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
29060 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70  strcmp(zOpt, aOp
29070 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d  t[i].zOptName)==
29080 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  0 ){.      mask 
29090 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a  = aOpt[i].mask;.
290a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
290b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f   }.  }.  if( ono
290c0 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73  ff ) mask = ~mas
290d0 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65  k;.  if( i>=size
290e0 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
290f0 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20  aOpt[0]) ){.    
29100 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29110 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
29120 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
29130 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
29140 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  f:",.           
29150 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
29160 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  )0);.    for(i=0
29170 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29  ; i<sizeof(aOpt)
29180 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
29190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
291a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
291b0 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70 74  nterp, " ", aOpt
291c0 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3b 0a 20  [i].zOptName);. 
291d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
291e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
291f0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
29200 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
29210 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
29220 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29 3b 0a  ONS, db, mask);.
29230 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
29240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
29250 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68  er commands with
29260 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
29270 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  eter..*/.int Sql
29280 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
29290 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
292a0 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
292b0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
292c0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
292d0 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64  nt sqlite3_found
292e0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
292f0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74   int sqlite3_int
29300 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20  errupt_count;.  
29310 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
29320 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  e3_open_file_cou
29330 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
29340 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f   sqlite3_sort_co
29350 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
29360 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
29370 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49  t_time;.#if SQLI
29380 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65  TE_OS_UNIX && de
29390 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
293a0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
293b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
293c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
293d0 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b  ite3_hostid_num;
293e0 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e  .#endif.  extern
293f0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78   int sqlite3_max
29400 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74  _blobsize;.  ext
29410 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 42  ern int sqlite3B
29420 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
29430 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20  eport(void*,.   
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72         Tcl_Inter
29470 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43  p*,int,Tcl_Obj*C
29480 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63  ONST*);.  static
29490 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
294a0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
294b0 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50   Tcl_CmdProc *xP
294c0 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20  roc;.  } aCmd[] 
294d0 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65  = {.     { "db_e
294e0 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
294f0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
29500 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74  _CmdProc*)db_ent
29510 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
29520 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c   },.     { "db_l
29530 65 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20  eave",          
29540 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
29550 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61  _CmdProc*)db_lea
29560 76 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ve              
29570 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
29580 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22  te3_mprintf_int"
29590 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ,           (Tcl
295a0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
295b0 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20  3_mprintf_int   
295c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
295d0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
295e0 34 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c  4",         (Tcl
295f0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
29600 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20  3_mprintf_int64 
29610 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
29620 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
29630 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
29640 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
29650 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20  3_mprintf_long  
29660 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
29670 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22  te3_mprintf_str"
29680 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ,           (Tcl
29690 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
296a0 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20  3_mprintf_str   
296b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
296c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
296d0 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
296e0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
296f0 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20  3_snprintf_str  
29700 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
29710 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
29720 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c  nly",       (Tcl
29730 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
29740 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
29750 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  y},.     { "sqli
29760 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
29770 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  le",        (Tcl
29780 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
29790 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
297a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
297b0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
297c0 65 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  ed",        (Tcl
297d0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
297e0 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
297f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
29800 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
29810 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43  ouble",   (Tcl_C
29820 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
29830 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c  mprintf_hexdoubl
29840 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  e},.     { "sqli
29850 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65  te3_mprintf_z_te
29860 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  st",        (Tcl
29870 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d  _CmdProc*)test_m
29880 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20  printf_z        
29890 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
298a0 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73  e3_mprintf_n_tes
298b0 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
298c0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
298d0 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d  rintf_n        }
298e0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
298f0 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c  3_snprintf_int",
29900 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
29910 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70  mdProc*)test_snp
29920 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c  rintf_int     },
29930 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29940 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
29950 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d  id",     (Tcl_Cm
29960 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74  dProc*)test_last
29970 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a  _rowid       },.
29980 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
29990 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20  exec_printf",   
299a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
299b0 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
299c0 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20  printf      },. 
299d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
299e0 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20  xec_hex",       
299f0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
29a00 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68  roc*)test_exec_h
29a10 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ex         },.  
29a20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
29a30 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ec",            
29a40 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
29a50 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20  oc*)test_exec   
29a60 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
29a70 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
29a80 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20  c_nr",          
29a90 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
29aa0 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20  c*)test_exec_nr 
29ab0 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e           },.#ifn
29ac0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29ad0 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b  GET_TABLE.     {
29ae0 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61   "sqlite3_get_ta
29af0 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  ble_printf",    
29b00 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
29b10 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70  test_get_table_p
29b20 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a  rintf },.#endif.
29b30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
29b40 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20  close",         
29b50 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
29b60 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73  Proc*)sqlite_tes
29b70 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20  t_close     },. 
29b80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
29b90 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c  reate_function",
29ba0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
29bb0 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
29bc0 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20  _function  },.  
29bd0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
29be0 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c  eate_aggregate",
29bf0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
29c00 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
29c10 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20  aggregate },.   
29c20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69    { "sqlite_regi
29c30 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69  ster_test_functi
29c40 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  on", (Tcl_CmdPro
29c50 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72  c*)test_register
29c60 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20  _func    },.    
29c70 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74   { "sqlite_abort
29c80 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
29c90 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
29ca0 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20  *)sqlite_abort  
29cb0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
29cc0 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c  { "sqlite_bind",
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
29cf0 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20  )test_bind      
29d00 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
29d10 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20   "breakpoint",  
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
29d40 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20  test_breakpoint 
29d50 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
29d60 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20  "sqlite3_key",  
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
29d90 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20  est_key         
29da0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
29db0 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20  sqlite3_rekey", 
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
29de0 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20  st_rekey        
29df0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
29e00 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22  qlite_set_magic"
29e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
29e20 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
29e30 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20  ite_set_magic   
29e40 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
29e50 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22  lite3_interrupt"
29e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ,             (T
29e70 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
29e80 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20  _interrupt      
29e90 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
29ea0 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74  ite_delete_funct
29eb0 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63  ion",        (Tc
29ec0 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
29ed0 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20  e_function      
29ee0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
29ef0 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  te_delete_collat
29f00 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
29f10 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
29f20 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20  _collation      
29f30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
29f40 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
29f50 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
29f60 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74  CmdProc*)get_aut
29f70 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d  ocommit        }
29f80 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
29f90 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20  3_stack_used",  
29fa0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
29fb0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61  mdProc*)test_sta
29fc0 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c  ck_used       },
29fd0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
29fe0 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20  _busy_timeout", 
29ff0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2a000 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79  dProc*)test_busy
2a010 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a  _timeout     },.
2a020 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c       { "printf",
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2a050 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74  Proc*)test_print
2a060 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  f           },. 
2a070 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f      { "sqlite3Io
2a080 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20  Trace",         
2a090 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2a0a0 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  c*)test_io_trace
2a0b0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
2a0c0 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
2a0d0 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
2a0e0 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62  ame;.     Tcl_Ob
2a0f0 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  jCmdProc *xProc;
2a100 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65  .     void *clie
2a110 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a  ntData;.  } aObj
2a120 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  Cmd[] = {.     {
2a130 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   "sqlite3_connec
2a140 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20  tion_pointer",  
2a150 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69    get_sqlite_poi
2a160 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20  nter, 0 },.     
2a170 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2a180 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
2a190 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
2a1a0 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ,      0 },.    
2a1b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2a1c0 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20  _zeroblob",     
2a1d0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65      test_bind_ze
2a1e0 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20  roblob, 0 },.   
2a1f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2a200 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  d_int64",       
2a210 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
2a220 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20  nt64,    0 },.  
2a230 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2a240 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  nd_double",     
2a250 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2a260 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20  double,   0 },. 
2a270 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2a280 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20  ind_null",      
2a290 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2a2a0 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a  _null     ,0 },.
2a2b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a2c0 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20  bind_text",     
2a2d0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2a2e0 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c  d_text     ,0 },
2a2f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2a300 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20  _bind_text16",  
2a310 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2a320 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d  nd_text16   ,0 }
2a330 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2a340 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20  3_bind_blob",   
2a350 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2a360 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20  ind_blob     ,0 
2a370 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2a380 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
2a390 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f  r_count",  test_
2a3a0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
2a3b0 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ount, 0},.     {
2a3c0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
2a3d0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20  arameter_name", 
2a3e0 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
2a3f0 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c  meter_name,  0},
2a400 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2a410 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2a420 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69  index",  test_bi
2a430 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
2a440 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  ex, 0},.     { "
2a450 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
2a460 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20  ndings",        
2a470 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
2a480 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  ngs, 0},.     { 
2a490 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c  "sqlite3_sleep",
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20   test_sleep,    
2a4c0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
2a4d0 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64   "sqlite3_errcod
2a4e0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2a4f0 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20    test_errcode  
2a500 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2a510 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  { "sqlite3_exten
2a520 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20  ded_errcode",   
2a530 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f     test_ex_errco
2a540 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  de    ,0 },.    
2a550 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
2a560 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sg",            
2a570 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20      test_errmsg 
2a580 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2a590 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
2a5a0 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20  msg16",         
2a5b0 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
2a5c0 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  16      ,0 },.  
2a5d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
2a5e0 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  en",            
2a5f0 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20        test_open 
2a600 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
2a610 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
2a620 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20  pen16",         
2a630 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
2a640 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  16        ,0 },.
2a650 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a660 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20  open_v2",       
2a670 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
2a680 6e 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c  n_v2       ,0 },
2a690 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2a6a0 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20  _complete16",   
2a6b0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
2a6c0 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d  mplete16    ,0 }
2a6d0 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
2a6e0 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20  e3_prepare",    
2a6f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2a700 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30  prepare       ,0
2a710 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a720 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20  te3_prepare16", 
2a730 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2a740 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c  _prepare16     ,
2a750 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2a760 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22  ite3_prepare_v2"
2a770 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
2a780 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20  t_prepare_v2    
2a790 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2a7a0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b  lite3_prepare_tk
2a7b0 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65  t3134",       te
2a7c0 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  st_prepare_tkt31
2a7d0 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  34, 0},.     { "
2a7e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
2a7f0 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  6_v2",          
2a800 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
2a810 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  2  ,0 },.     { 
2a820 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a  "sqlite3_finaliz
2a830 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2a840 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20   test_finalize  
2a850 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2a860 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73   "sqlite3_stmt_s
2a870 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20  tatus",         
2a880 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74    test_stmt_stat
2a890 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  us   ,0 },.     
2a8a0 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74  { "sqlite3_reset
2a8b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2a8c0 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20     test_reset   
2a8d0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2a8e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69   { "sqlite3_expi
2a8f0 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  red",           
2a900 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64      test_expired
2a910 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2a920 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61    { "sqlite3_tra
2a930 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c  nsfer_bindings",
2a940 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66       test_transf
2a950 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20  er_bind ,0 },.  
2a960 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68     { "sqlite3_ch
2a970 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
2a980 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67        test_chang
2a990 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  es       ,0 },. 
2a9a0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2a9b0 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  tep",           
2a9c0 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70         test_step
2a9d0 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
2a9e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a9f0 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  sql",           
2aa00 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c          test_sql
2aa10 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c             ,0 },
2aa20 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2aa30 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20  _next_stmt",    
2aa40 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65           test_ne
2aa50 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d  xt_stmt     ,0 }
2aa60 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2aa70 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22  3_stmt_readonly"
2aa80 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ,         test_s
2aa90 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20  tmt_readonly ,0 
2aaa0 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 73 5f  },.     { "uses_
2aab0 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20  stmt_journal",  
2aac0 20 20 20 20 20 20 20 20 20 20 20 75 73 65 73 5f             uses_
2aad0 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20  stmt_journal ,0 
2aae0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
2aaf0 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
2ab00 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  ry",        test
2ab10 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
2ab20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
2ab30 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65  "sqlite3_db_rele
2ab40 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20  ase_memory",    
2ab50 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65   test_db_release
2ab60 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20  _memory,  0},.  
2ab70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
2ab80 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20  _filename",     
2ab90 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66 69        test_db_fi
2aba0 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30  lename,        0
2abb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2abc0 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
2abd0 69 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  it",       test_
2abe0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c  soft_heap_limit,
2abf0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
2ac00 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
2ac10 6c 65 61 6e 75 70 22 2c 20 20 20 20 20 20 20 20  leanup",        
2ac20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61  test_thread_clea
2ac30 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  nup,     0},.   
2ac40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 61 67    { "sqlite3_pag
2ac50 65 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20 20  er_refcounts",  
2ac60 20 20 20 20 20 74 65 73 74 5f 70 61 67 65 72 5f       test_pager_
2ac70 72 65 66 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d  refcounts,    0}
2ac80 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
2ac90 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
2aca0 6e 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  n",        test_
2acb0 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20  load_extension, 
2acc0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
2acd0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
2ace0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20  oad_extension", 
2acf0 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
2ad00 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
2ad10 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74    { "sqlite3_ext
2ad20 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
2ad30 65 73 22 2c 20 74 65 73 74 5f 65 78 74 65 6e 64  es", test_extend
2ad40 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c  ed_result_codes,
2ad50 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2ad60 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20  ite3_limit",    
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2ad80 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20 20 20  t_limit,        
2ad90 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 0a 20 20           0},..  
2ada0 20 20 20 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f     { "save_prng_
2adb0 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  state",         
2adc0 20 20 20 20 20 20 73 61 76 65 5f 70 72 6e 67 5f        save_prng_
2add0 73 74 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20  state,    0 },. 
2ade0 20 20 20 20 7b 20 22 72 65 73 74 6f 72 65 5f 70      { "restore_p
2adf0 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20  rng_state",     
2ae00 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70         restore_p
2ae10 72 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c 0a  rng_state, 0 },.
2ae20 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 70 72       { "reset_pr
2ae30 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20  ng_state",      
2ae40 20 20 20 20 20 20 20 20 72 65 73 65 74 5f 70 72          reset_pr
2ae50 6e 67 5f 73 74 61 74 65 2c 20 20 20 30 20 7d 2c  ng_state,   0 },
2ae60 0a 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a  .     { "optimiz
2ae70 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20  ation_control", 
2ae80 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
2ae90 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d  ation_control,0}
2aea0 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ,.#if SQLITE_OS_
2aeb0 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b  WIN.     { "lock
2aec0 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20  _win32_file",   
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
2aee0 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20  2_file_lock,    
2aef0 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 },.#endif.    
2af00 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72 6f 63 22   { "tcl_objproc"
2af10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2af20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63      runAsObjProc
2af30 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 20 20  ,       0 },..  
2af40 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f     /* sqlite3_co
2af50 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a  lumn_*() API */.
2af60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2af70 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20  column_count",  
2af80 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
2af90 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c  umn_count  ,0 },
2afa0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2afb0 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20  _data_count",   
2afc0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 61           test_da
2afd0 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d  ta_count    ,0 }
2afe0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2aff0 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20  3_column_type", 
2b000 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2b010 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20  olumn_type   ,0 
2b020 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b030 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c  e3_column_blob",
2b040 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2b050 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30  column_blob   ,0
2b060 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b070 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
2b080 65 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  e",         test
2b090 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c  _column_double ,
2b0a0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2b0b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
2b0c0 34 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  4",          tes
2b0d0 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20  t_column_int64  
2b0e0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2b0f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2b100 74 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  t",   test_stmt_
2b110 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71  utf8,  (void*)sq
2b120 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2b130 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  t },.     { "sql
2b140 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
2b150 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  ",   test_stmt_u
2b160 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c  tf8,  (void*)sql
2b170 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
2b180 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b190 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c  te3_column_int",
2b1a0 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
2b1b0 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69  t,   (void*)sqli
2b1c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20  te3_column_int  
2b1d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b1e0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22  e3_column_bytes"
2b1f0 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  ,  test_stmt_int
2b200 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  ,   (void*)sqlit
2b210 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d  e3_column_bytes}
2b220 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
2b230 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
2b240 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2b250 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c  olumn_decltype",
2b260 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
2b270 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2b280 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a  lumn_decltype},.
2b290 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2b2a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2b2b0 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20 22 73  MN_METADATA.{ "s
2b2c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
2b2d0 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c 74 65 73  tabase_name",tes
2b2e0 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
2b2f0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2b300 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d  n_database_name}
2b310 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  ,.{ "sqlite3_col
2b320 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c  umn_table_name",
2b330 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
2b340 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2b350 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d  lumn_table_name}
2b360 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  ,.{ "sqlite3_col
2b370 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22  umn_origin_name"
2b380 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c  ,test_stmt_utf8,
2b390 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2b3a0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
2b3b0 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  e},.#endif..#ifn
2b3c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b3d0 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 73 71  UTF16.     { "sq
2b3e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2b3f0 65 73 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  es16", test_stmt
2b400 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29 73 71 6c  _int, (void*)sql
2b410 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2b420 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s16 },.     { "s
2b430 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2b440 78 74 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d  xt16",  test_stm
2b450 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
2b460 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2b470 65 78 74 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22  ext16},.     { "
2b480 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
2b490 61 6d 65 31 36 22 2c 20 20 74 65 73 74 5f 73 74  ame16",  test_st
2b4a0 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a  mt_utf16, (void*
2b4b0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2b4c0 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20  name16},.     { 
2b4d0 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74  "add_alignment_t
2b4e0 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c  est_collations",
2b4f0 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74   add_alignment_t
2b500 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20  est_collations, 
2b510 30 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65  0      },.#ifnde
2b520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
2b530 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
2b540 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
2b550 63 6c 74 79 70 65 31 36 22 2c 74 65 73 74 5f 73  cltype16",test_s
2b560 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f 69 64 2a  tmt_utf16,(void*
2b570 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2b580 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23 65 6e  decltype16},.#en
2b590 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2b5a0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2b5b0 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c 69 74  METADATA.{"sqlit
2b5c0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
2b5d0 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65  se_name16",.  te
2b5e0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73  st_stmt_utf16, s
2b5f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
2b600 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a  tabase_name16},.
2b610 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
2b620 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20  _table_name16", 
2b630 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2b640 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2b650 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
2b660 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f  e16},.{"sqlite3_
2b670 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
2b680 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  me16", test_stmt
2b690 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
2b6a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
2b6b0 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65  igin_name16},.#e
2b6c0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20  ndif.#endif.    
2b6d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
2b6e0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22  te_collation_v2"
2b6f0 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f  , test_create_co
2b700 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c  llation_v2, 0 },
2b710 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b720 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22  _global_recover"
2b730 2c 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61  ,     test_globa
2b740 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d  l_recover, 0   }
2b750 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e  ,.     { "workin
2b760 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20  g_64bit_int",   
2b770 20 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36         working_6
2b780 34 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20  4bit_int,   0   
2b790 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75  },.     { "vfs_u
2b7a0 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20  nlink_test",    
2b7b0 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69          vfs_unli
2b7c0 6e 6b 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20  nk_test,     0  
2b7d0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
2b7e0 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20  initfail_test", 
2b7f0 20 20 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69           vfs_ini
2b800 74 66 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20  tfail_test,   0 
2b810 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73    },.     { "vfs
2b820 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22  _unregister_all"
2b830 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e  ,         vfs_un
2b840 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30  register_all,  0
2b850 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66     },.     { "vf
2b860 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
2b870 22 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 72  ",         vfs_r
2b880 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20  eregister_all,  
2b890 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2b8a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
2b8b0 22 2c 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  ",          file
2b8c0 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20  _control_test,  
2b8d0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2b8e0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73  file_control_las
2b8f0 74 65 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69  terrno_test", fi
2b900 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
2b910 72 72 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20  rrno_test,  0   
2b920 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2b930 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78  control_lockprox
2b940 79 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  y_test", file_co
2b950 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
2b960 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20  test,  0   },.  
2b970 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
2b980 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73  ol_chunksize_tes
2b990 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  t", file_control
2b9a0 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 2c  _chunksize_test,
2b9b0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
2b9c0 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69  "file_control_si
2b9d0 7a 65 68 69 6e 74 5f 74 65 73 74 22 2c 20 20 66  zehint_test",  f
2b9e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
2b9f0 68 69 6e 74 5f 74 65 73 74 2c 20 20 20 30 20 20  hint_test,   0  
2ba00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
2ba10 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
2ba20 76 5f 72 65 74 72 79 22 2c 20 66 69 6c 65 5f 63  v_retry", file_c
2ba30 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f  ontrol_win32_av_
2ba40 72 65 74 72 79 2c 20 20 30 20 20 20 7d 2c 0a 20  retry,  0   },. 
2ba50 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
2ba60 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22  rol_persist_wal"
2ba70 2c 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  ,    file_contro
2ba80 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20  l_persist_wal,  
2ba90 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
2baa0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76   "file_control_v
2bab0 66 73 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20  fsname",        
2bac0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
2bad0 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 30 20  name,         0 
2bae0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2baf0 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20  ite3_vfs_list", 
2bb00 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 6c 69            vfs_li
2bb10 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20  st,     0   },. 
2bb20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2bb30 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
2bb40 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f  2", test_create_
2bb50 66 75 6e 63 74 69 6f 6e 5f 76 32 2c 20 30 20 7d  function_v2, 0 }
2bb60 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74  ,..     /* Funct
2bb70 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a  ions from os.h *
2bb80 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2bb90 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
2bba0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
2bbb0 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74 65  late",        te
2bbc0 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20  st_collate, 0   
2bbd0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2bbe0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
2bbf0 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65  late_needed", te
2bc00 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
2bc10 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20  d, 0     },.    
2bc20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e   { "add_test_fun
2bc30 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65  ction",       te
2bc40 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20  st_function, 0  
2bc50 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64           },.#end
2bc60 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
2bc70 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c  e3_test_errstr",
2bc80 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74 72       test_errstr
2bc90 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  , 0             
2bca0 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76  },.     { "tcl_v
2bcb0 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20  ariable_type",  
2bcc0 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c       tcl_variabl
2bcd0 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20 20  e_type, 0       
2bce0 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
2bcf0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2bd00 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  CHE.     { "sqli
2bd10 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
2bd20 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65  d_cache", test_e
2bd30 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20  nable_shared, 0 
2bd40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2bd50 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
2bd60 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65  _report", sqlite
2bd70 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
2bd80 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e  eReport, 0},.#en
2bd90 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
2bda0 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
2bdb0 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62  umber", test_lib
2bdc0 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20  version_number, 
2bdd0 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  0  },.#ifdef SQL
2bde0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
2bdf0 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
2be00 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  { "sqlite3_table
2be10 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
2be20 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f  ", test_table_co
2be30 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30  lumn_metadata, 0
2be40 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e    },.#endif.#ifn
2be50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2be60 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20  INCRBLOB.     { 
2be70 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65  "sqlite3_blob_re
2be80 61 64 22 2c 20 20 20 74 65 73 74 5f 62 6c 6f 62  ad",   test_blob
2be90 5f 72 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20  _read, 0  },.   
2bea0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
2beb0 62 5f 77 72 69 74 65 22 2c 20 20 74 65 73 74 5f  b_write",  test_
2bec0 62 6c 6f 62 5f 77 72 69 74 65 2c 20 30 20 20 7d  blob_write, 0  }
2bed0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2bee0 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20  3_blob_reopen", 
2bef0 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  test_blob_reopen
2bf00 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
2bf10 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
2bf20 65 73 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f  es",  test_blob_
2bf30 62 79 74 65 73 2c 20 30 20 20 7d 2c 0a 20 20 20  bytes, 0  },.   
2bf40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
2bf50 62 5f 63 6c 6f 73 65 22 2c 20 20 74 65 73 74 5f  b_close",  test_
2bf60 62 6c 6f 62 5f 63 6c 6f 73 65 2c 20 30 20 20 7d  blob_close, 0  }
2bf70 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
2bf80 22 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20  "pcache_stats", 
2bf90 20 20 20 20 20 20 74 65 73 74 5f 70 63 61 63 68        test_pcach
2bfa0 65 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23  e_stats, 0  },.#
2bfb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2bfc0 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
2bfd0 59 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  Y.     { "sqlite
2bfe0 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22  3_unlock_notify"
2bff0 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  , test_unlock_no
2c000 74 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64  tify, 0  },.#end
2c010 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
2c020 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
2c030 74 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f 63  t",   test_wal_c
2c040 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c  heckpoint, 0  },
2c050 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c060 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
2c070 76 32 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65  v2",test_wal_che
2c080 63 6b 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d  ckpoint_v2, 0  }
2c090 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74 5f 73  ,.     { "test_s
2c0a0 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20  qlite3_log",    
2c0b0 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65       test_sqlite
2c0c0 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66  3_log, 0  },.#if
2c0d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c0e0 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20  _EXPLAIN.     { 
2c0f0 22 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71  "print_explain_q
2c100 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74  uery_plan", test
2c110 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d  _print_eqp, 0  }
2c120 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
2c130 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f  "sqlite3_test_co
2c140 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73  ntrol", test_tes
2c150 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 20 20 7d  t_control },.  }
2c160 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62  ;.  static int b
2c170 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69  itmask_size = si
2c180 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b  zeof(Bitmask)*8;
2c190 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65  .  int i;.  exte
2c1a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
2c1b0 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74  ync_count, sqlit
2c1c0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
2c1d0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2c1e0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
2c1f0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
2c200 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b   int sqlite3_lik
2c210 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  e_count;.  exter
2c220 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66  n int sqlite3_xf
2c230 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65  eropt_count;.  e
2c240 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2c250 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
2c260 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2c270 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2c280 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a  _writedb_count;.
2c290 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2c2a0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2c2b0 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c  j_count;.#if SQL
2c2c0 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74  ITE_OS_WIN.  ext
2c2d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2c2e0 6f 73 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a  os_type;.#endif.
2c2f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2c300 42 55 47 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  BUG.  extern int
2c310 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2c320 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  ce;.  extern int
2c330 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 3b   sqlite3OSTrace;
2c340 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c350 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
2c360 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ace;.  extern in
2c370 74 20 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63  t sqlite3WalTrac
2c380 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e;.#endif.#ifdef
2c390 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
2c3a0 78 74 65 72 6e 20 63 68 61 72 20 73 71 6c 69 74  xtern char sqlit
2c3b0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b  e3_query_plan[];
2c3c0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a  .  static char *
2c3d0 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 73 71 6c  query_plan = sql
2c3e0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 3b  ite3_query_plan;
2c3f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2c400 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74  NABLE_FTS3.  ext
2c410 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2c420 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
2c430 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a  ntheses;.#endif.
2c440 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d  #endif..  for(i=
2c450 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64  0; i<sizeof(aCmd
2c460 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d  )/sizeof(aCmd[0]
2c470 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
2c480 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
2c490 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a  nterp, aCmd[i].z
2c4a0 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50  Name, aCmd[i].xP
2c4b0 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  roc, 0, 0);.  }.
2c4c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
2c4d0 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a  eof(aObjCmd)/siz
2c4e0 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b  eof(aObjCmd[0]);
2c4f0 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
2c500 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
2c510 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b  interp, aObjCmd[
2c520 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  i].zName, .     
2c530 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50     aObjCmd[i].xP
2c540 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  roc, aObjCmd[i].
2c550 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a  clientData, 0);.
2c560 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61    }.  Tcl_LinkVa
2c570 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2c580 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c  e_search_count",
2c590 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
2c5a0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
2c5b0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2c5c0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2c5d0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2c5e0 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c  te_found_count",
2c5f0 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
2c600 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
2c610 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
2c620 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
2c630 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2c640 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a  e_sort_count", .
2c650 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2c660 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
2c670 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2c680 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2c690 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
2c6a0 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a  max_blobsize", .
2c6b0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2c6c0 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
2c6d0 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ze, TCL_LINK_INT
2c6e0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
2c6f0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2c700 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20  _like_count", . 
2c710 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2c720 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c  ite3_like_count,
2c730 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2c740 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2c750 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e  terp, "sqlite_in
2c760 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20  terrupt_count", 
2c770 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2c780 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
2c790 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
2c7a0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2c7b0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2c7c0 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  lite_open_file_c
2c7d0 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
2c7e0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70  har*)&sqlite3_op
2c7f0 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54  en_file_count, T
2c800 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2c810 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2c820 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72  rp, "sqlite_curr
2c830 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20  ent_time", .    
2c840 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2c850 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20  3_current_time, 
2c860 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
2c870 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
2c880 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  X && defined(__A
2c890 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2c8a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2c8b0 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e  _STYLE.  Tcl_Lin
2c8c0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2c8d0 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22  lite_hostid_num"
2c8e0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
2c8f0 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  &sqlite3_hostid_
2c900 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  num, TCL_LINK_IN
2c910 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c  T);.#endif.  Tcl
2c920 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2c930 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70   "sqlite3_xferop
2c940 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  t_count",.      
2c950 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2c960 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54  xferopt_count, T
2c970 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2c980 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2c990 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
2c9a0 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22  er_readdb_count"
2c9b0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2c9c0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
2c9d0 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  addb_count, TCL_
2c9e0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2c9f0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2ca00 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
2ca10 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a  writedb_count",.
2ca20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2ca30 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2ca40 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  edb_count, TCL_L
2ca50 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
2ca60 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
2ca70 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  "sqlite3_pager_w
2ca80 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20  ritej_count",.  
2ca90 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2caa0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
2cab0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
2cac0 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53  _INT);.#ifndef S
2cad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
2cae0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2caf0 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65  nterp, "unaligne
2cb00 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
2cb10 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2cb20 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e  &unaligned_strin
2cb30 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c  g_counter, TCL_L
2cb40 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
2cb50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2cb60 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c  OMIT_UTF16.  Tcl
2cb70 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2cb80 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65   "sqlite_last_ne
2cb90 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c  eded_collation",
2cba0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70  .      (char*)&p
2cbb0 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
2cbc0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
2cbd0 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
2cbe0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
2cbf0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
2cc00 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2cc10 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73  terp, "sqlite_os
2cc20 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63  _type",.      (c
2cc30 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73  har*)&sqlite3_os
2cc40 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _type, TCL_LINK_
2cc50 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  INT);.#endif.#if
2cc60 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2cc70 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2cc80 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75  terp, "sqlite_qu
2cc90 65 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20  ery_plan",.     
2cca0 20 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70   (char*)&query_p
2ccb0 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54  lan, TCL_LINK_ST
2ccc0 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  RING|TCL_LINK_RE
2ccd0 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AD_ONLY);.#endif
2cce0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2ccf0 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  EBUG.  Tcl_LinkV
2cd00 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2cd10 74 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 22 2c  te_addop_trace",
2cd20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2cd30 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
2cd40 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
2cd50 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2cd60 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2cd70 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c  te_where_trace",
2cd80 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2cd90 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2cda0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2cdb0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2cdc0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
2cdd0 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20  s_trace",.      
2cde0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f  (char*)&sqlite3O
2cdf0 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b  STrace, TCL_LINK
2ce00 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53  _INT);.#ifndef S
2ce10 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2ce20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2ce30 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c  erp, "sqlite_wal
2ce40 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
2ce50 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57 61  char*)&sqlite3Wa
2ce60 6c 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b  lTrace, TCL_LINK
2ce70 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65  _INT);.#endif.#e
2ce80 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
2ce90 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
2cea0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2ceb0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
2cec0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20  entemp_count",. 
2ced0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2cee0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
2cef0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
2cf00 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c  T);.#endif.  Tcl
2cf10 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2cf20 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
2cf30 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20  bind_value",.   
2cf40 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2cf50 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
2cf60 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54  lue, TCL_LINK_ST
2cf70 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  RING);.  Tcl_Lin
2cf80 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2cf90 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
2cfa0 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20 20 28  _nbyte",.      (
2cfb0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74  char*)&sqlite_st
2cfc0 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c  atic_bind_nbyte,
2cfd0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2cfe0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2cff0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65  terp, "sqlite_te
2d000 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20  mp_directory",. 
2d010 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2d020 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
2d030 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54  ory, TCL_LINK_ST
2d040 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  RING);.  Tcl_Lin
2d050 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69  kVar(interp, "bi
2d060 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20  tmask_size",.   
2d070 20 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61     (char*)&bitma
2d080 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e  sk_size, TCL_LIN
2d090 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52  K_INT|TCL_LINK_R
2d0a0 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c  EAD_ONLY);.  Tcl
2d0b0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2d0c0 20 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f   "sqlite_sync_co
2d0d0 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
2d0e0 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63  r*)&sqlite3_sync
2d0f0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
2d100 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2d110 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2d120 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  lite_fullsync_co
2d130 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
2d140 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c  r*)&sqlite3_full
2d150 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sync_count, TCL_
2d160 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64  LINK_INT);.#if d
2d170 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2d180 41 42 4c 45 5f 46 54 53 33 29 20 26 26 20 64 65  ABLE_FTS3) && de
2d190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
2d1a0 54 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  T).  Tcl_LinkVar
2d1b0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2d1c0 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72  _fts3_enable_par
2d1d0 65 6e 74 68 65 73 65 73 22 2c 0a 20 20 20 20 20  entheses",.     
2d1e0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2d1f0 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72  _fts3_enable_par
2d200 65 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49  entheses, TCL_LI
2d210 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
2d220 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2d230 0a 7d 0a                                         .}.