/ Hex Artifact Content
Login

Artifact ad2ae36959d6ac480f54b7e07d4baad8ee3b2e88:


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 74 68 65 20 70  or testing the p
0190: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
01a0: 65 20 74 6f 20 53 51 4c 69 74 65 2e 20 20 54 68  e to SQLite.  Th
01b0: 69 73 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f  is code.** is no
01c0: 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  t included in th
01d0: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
01e0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 66 6f  .  It is used fo
01f0: 72 20 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74  r automated.** t
0200: 65 73 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51  esting of the SQ
0210: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a  Lite library..**
0220: 0a 2a 2a 20 24 49 64 3a 20 74 65 73 74 31 2e 63  .** $Id: test1.c
0230: 2c 76 20 31 2e 39 31 20 32 30 30 34 2f 30 36 2f  ,v 1.91 2004/06/
0240: 33 30 20 30 34 3a 30 32 3a 31 32 20 64 72 68 20  30 04:02:12 drh 
0250: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0260: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0270: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22  #include "tcl.h"
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
0290: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
02a0: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  b.h>.#include <s
02b0: 74 72 69 6e 67 2e 68 3e 0a 0a 23 69 66 20 4f 53  tring.h>..#if OS
02c0: 5f 57 49 4e 0a 23 20 64 65 66 69 6e 65 20 50 54  _WIN.# define PT
02d0: 52 5f 46 4d 54 20 22 25 78 22 0a 23 65 6c 73 65  R_FMT "%x".#else
02e0: 0a 23 20 64 65 66 69 6e 65 20 50 54 52 5f 46 4d  .# define PTR_FM
02f0: 54 20 22 25 70 22 0a 23 65 6e 64 69 66 0a 0a 69  T "%p".#endif..i
0300: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  nt sqlite3_exec_
0310: 70 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65  printf(.  sqlite
0320: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
0330: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70          /* An op
0340: 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  en database */. 
0350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
0360: 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20 2f  Format,        /
0370: 2a 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20 66  * printf-style f
0380: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72  ormat string for
0390: 20 74 68 65 20 53 51 4c 20 2a 2f 0a 20 20 73 71   the SQL */.  sq
03a0: 6c 69 74 65 5f 63 61 6c 6c 62 61 63 6b 20 78 43  lite_callback xC
03b0: 61 6c 6c 62 61 63 6b 2c 20 20 20 20 2f 2a 20 43  allback,    /* C
03c0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
03d0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
03e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
03f0: 20 20 20 20 2f 2a 20 31 73 74 20 61 72 67 75 6d      /* 1st argum
0400: 65 6e 74 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20  ent to callback 
0410: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  function */.  ch
0420: 61 72 20 2a 2a 65 72 72 6d 73 67 2c 20 20 20 20  ar **errmsg,    
0430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
0440: 72 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e  rror msg written
0450: 20 68 65 72 65 20 2a 2f 0a 20 20 2e 2e 2e 20 20   here */.  ...  
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
0480: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 6f 72  ments to the for
0490: 6d 61 74 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 29  mat string. */.)
04a0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65  ;.int sqlite3_ge
04b0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a  t_table_printf(.
04c0: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
04d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f           /* An o
04e0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  pen database */.
04f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71    const char *sq
0500: 6c 46 6f 72 6d 61 74 2c 20 2f 2a 20 70 72 69 6e  lFormat, /* prin
0510: 74 66 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20  tf-style format 
0520: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 53  string for the S
0530: 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 2a  QL */.  char ***
0540: 72 65 73 75 6c 74 70 2c 20 20 20 20 20 20 20 2f  resultp,       /
0550: 2a 20 52 65 73 75 6c 74 20 77 72 69 74 74 65 6e  * Result written
0560: 20 74 6f 20 61 20 63 68 61 72 20 2a 5b 5d 20 20   to a char *[]  
0570: 74 68 61 74 20 74 68 69 73 20 70 6f 69 6e 74 73  that this points
0580: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 72   to */.  int *nr
0590: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
05a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
05b0: 75 6c 74 20 72 6f 77 73 20 77 72 69 74 74 65 6e  ult rows written
05c0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
05d0: 6e 63 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ncol,           
05e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
05f0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 77 72  esult columns wr
0600: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
0610: 63 68 61 72 20 2a 2a 65 72 72 6d 73 67 2c 20 20  char **errmsg,  
0620: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
0630: 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72 65  msg written here
0640: 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20   */.  ...       
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0660: 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  Arguments to the
0670: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a   format string *
0680: 2f 0a 29 3b 0a 0a 73 74 61 74 69 63 20 63 6f 6e  /.);..static con
0690: 73 74 20 63 68 61 72 20 2a 20 65 72 72 6f 72 4e  st char * errorN
06a0: 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63  ame(int rc){.  c
06b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
06c0: 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20   = 0;.  switch( 
06d0: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
06e0: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
06f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0700: 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20  E_OK";          
0710: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0720: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
0730: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0740: 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20  TE_ERROR";      
0750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0760: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
0770: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
0780: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20  ITE_INTERNAL";  
0790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
07a0: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
07b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
07c0: 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20  LITE_PERM";     
07d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
07e0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
07f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0800: 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20  QLITE_ABORT";   
0810: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0820: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
0830: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0840: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
0850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0860: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
0870: 45 44 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ED:     zName = 
0880: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b  "SQLITE_LOCKED";
0890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
08a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d   case SQLITE_NOM
08b0: 45 4d 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  EM:      zName =
08c0: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
08d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
08e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
08f0: 41 44 4f 4e 4c 59 3a 20 20 20 7a 4e 61 6d 65 20  ADONLY:   zName 
0900: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
0910: 4c 59 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  LY";    break;. 
0920: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
0930: 4e 54 45 52 52 55 50 54 3a 20 20 7a 4e 61 6d 65  NTERRUPT:  zName
0940: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
0950: 52 55 50 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  RUPT";   break;.
0960: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0970: 49 4f 45 52 52 3a 20 20 20 20 20 20 7a 4e 61 6d  IOERR:      zNam
0980: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
0990: 52 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  R";       break;
09a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
09b0: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 7a 4e 61  _CORRUPT:    zNa
09c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
09d0: 52 55 50 54 22 3b 20 20 20 20 20 62 72 65 61 6b  RUPT";     break
09e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
09f0: 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 7a 4e  E_NOTFOUND:   zN
0a00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
0a10: 54 46 4f 55 4e 44 22 3b 20 20 20 20 62 72 65 61  TFOUND";    brea
0a20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0a30: 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a  TE_FULL:       z
0a40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
0a50: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
0a60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0a70: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
0a80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0a90: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 62 72  CANTOPEN";    br
0aa0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0ab0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
0ac0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0ad0: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 62  _PROTOCOL";    b
0ae0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0af0: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
0b00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0b10: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
0b20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0b30: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
0b40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0b50: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
0b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0b70: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20   SQLITE_TOOBIG: 
0b80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0b90: 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20  ITE_TOOBIG";    
0ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0bb0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
0bc0: 49 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  INT: zName = "SQ
0bd0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
0be0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
0bf0: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
0c00: 43 48 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CH:   zName = "S
0c10: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
0c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0c30: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
0c40: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
0c50: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
0c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0c70: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
0c80: 53 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  S:      zName = 
0c90: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
0ca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0cb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54   case SQLITE_AUT
0cc0: 48 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  H:       zName =
0cd0: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
0ce0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0cf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
0d00: 52 4d 41 54 3a 20 20 20 20 20 7a 4e 61 6d 65 20  RMAT:     zName 
0d10: 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  = "SQLITE_FORMAT
0d20: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
0d30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
0d40: 41 4e 47 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65  ANGE:      zName
0d50: 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45   = "SQLITE_RANGE
0d60: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0d70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0d80: 52 4f 57 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ROW:        zNam
0d90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22  e = "SQLITE_ROW"
0da0: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
0db0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0dc0: 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 7a 4e 61  _DONE:       zNa
0dd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e  me = "SQLITE_DON
0de0: 45 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  E";        break
0df0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0e00: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 7a 4e  E_NOTADB:     zN
0e10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
0e20: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 62 72  TADB";        br
0e30: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
0e40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
0e50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0e60: 5f 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20 20 62  _Unknown";     b
0e70: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
0e80: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
0e90: 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e  ** Decode a poin
0ea0: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
0eb0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
0ec0: 69 63 20 69 6e 74 20 67 65 74 44 62 50 6f 69 6e  ic int getDbPoin
0ed0: 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ter(Tcl_Interp *
0ee0: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
0ef0: 61 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 20 2a  ar *zA, sqlite *
0f00: 2a 70 70 44 62 29 7b 0a 20 20 69 66 28 20 73 73  *ppDb){.  if( ss
0f10: 63 61 6e 66 28 7a 41 2c 20 50 54 52 5f 46 4d 54  canf(zA, PTR_FMT
0f20: 2c 20 28 76 6f 69 64 2a 2a 29 70 70 44 62 29 21  , (void**)ppDb)!
0f30: 3d 31 20 26 26 20 0a 20 20 20 20 20 20 28 7a 41  =1 && .      (zA
0f40: 5b 30 5d 21 3d 27 30 27 20 7c 7c 20 7a 41 5b 31  [0]!='0' || zA[1
0f50: 5d 21 3d 27 78 27 20 7c 7c 20 73 73 63 61 6e 66  ]!='x' || sscanf
0f60: 28 26 7a 41 5b 32 5d 2c 20 50 54 52 5f 46 4d 54  (&zA[2], PTR_FMT
0f70: 2c 20 28 76 6f 69 64 2a 2a 29 70 70 44 62 29 21  , (void**)ppDb)!
0f80: 3d 31 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c  =1).  ){.    Tcl
0f90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0fa0: 74 65 72 70 2c 20 22 5c 22 22 2c 20 7a 41 2c 20  terp, "\"", zA, 
0fb0: 22 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  "\" is not a val
0fc0: 69 64 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  id pointer value
0fd0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
0fe0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
0ff0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
1010: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
1020: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
1030: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
1040: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
1050: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
1060: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
1070: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
1080: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
1090: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 69   **ppStmt.){.  i
10a0: 66 28 20 73 73 63 61 6e 66 28 7a 41 72 67 2c 20  f( sscanf(zArg, 
10b0: 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64 2a 2a  PTR_FMT, (void**
10c0: 29 70 70 53 74 6d 74 29 21 3d 31 20 29 7b 0a 20  )ppStmt)!=1 ){. 
10d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 5c 22 22  ult(interp, "\""
10f0: 2c 20 7a 41 72 67 2c 20 22 5c 22 20 69 73 20 6e  , zArg, "\" is n
1100: 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ot a valid point
1110: 65 72 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  er value", 0);. 
1120: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1130: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
1140: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1150: 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e  ** Decode a poin
1160: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1170: 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a  3_stmt object..*
1180: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1190: 46 69 6c 65 50 6f 69 6e 74 65 72 28 0a 20 20 54  FilePointer(.  T
11a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11b0: 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
11c0: 20 2a 7a 41 72 67 2c 20 20 0a 20 20 4f 73 46 69   *zArg,  .  OsFi
11d0: 6c 65 20 2a 2a 70 70 46 69 6c 65 0a 29 7b 0a 20  le **ppFile.){. 
11e0: 20 69 66 28 20 73 73 63 61 6e 66 28 7a 41 72 67   if( sscanf(zArg
11f0: 2c 20 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64  , PTR_FMT, (void
1200: 2a 2a 29 70 70 46 69 6c 65 29 21 3d 31 20 29 7b  **)ppFile)!=1 ){
1210: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1220: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 5c  esult(interp, "\
1230: 22 22 2c 20 7a 41 72 67 2c 20 22 5c 22 20 69 73  "", zArg, "\" is
1240: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 69   not a valid poi
1250: 6e 74 65 72 20 76 61 6c 75 65 22 2c 20 30 29 3b  nter value", 0);
1260: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1270: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
1280: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1290: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
12a0: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
12b0: 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ion of a pointer
12c0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64   that can be und
12d0: 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68  erstood.** by th
12e0: 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61  e getDbPointer a
12f0: 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20  nd getVmPointer 
1300: 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a  routines above..
1310: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65  **.** The proble
1320: 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61  m is, on some ma
1330: 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29  chines (Solaris)
1340: 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69   if you do a pri
1350: 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22  ntf with.** "%p"
1360: 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e   you cannot turn
1370: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61   around and do a
1380: 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20   scanf with the 
1390: 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a  same "%p" and.**
13a0: 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65   get your pointe
13b0: 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76  r back.  You hav
13c0: 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22  e to prepend a "
13d0: 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69  0x" before it wi
13e0: 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20  ll.** work.  Or 
13f0: 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73  at least that is
1400: 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65   what is reporte
1410: 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20  d to me (drh).  
1420: 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61  But this.** beha
1430: 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d  vior varies from
1440: 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68   machine to mach
1450: 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69  ine.  The soluti
1460: 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a  on used her is.*
1470: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74  * to test the st
1480: 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72  ring right after
1490: 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64   it is generated
14a0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
14b0: 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f  n be.** understo
14c0: 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64  od by scanf, and
14d0: 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65   if not, try pre
14e0: 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20  pending an "0x" 
14f0: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61  to see if.** tha
1500: 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74  t helps.  If not
1510: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61  hing works, a fa
1520: 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  tal error is gen
1530: 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erated..*/.stati
1540: 63 20 69 6e 74 20 6d 61 6b 65 50 6f 69 6e 74 65  c int makePointe
1550: 72 53 74 72 28 54 63 6c 5f 49 6e 74 65 72 70 20  rStr(Tcl_Interp 
1560: 2a 69 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 7a  *interp, char *z
1570: 50 74 72 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20  Ptr, void *p){. 
1580: 20 76 6f 69 64 20 2a 70 32 3b 0a 20 20 73 70 72   void *p2;.  spr
1590: 69 6e 74 66 28 7a 50 74 72 2c 20 50 54 52 5f 46  intf(zPtr, PTR_F
15a0: 4d 54 2c 20 70 29 3b 0a 20 20 69 66 28 20 73 73  MT, p);.  if( ss
15b0: 63 61 6e 66 28 7a 50 74 72 2c 20 50 54 52 5f 46  canf(zPtr, PTR_F
15c0: 4d 54 2c 20 26 70 32 29 21 3d 31 20 7c 7c 20 70  MT, &p2)!=1 || p
15d0: 32 21 3d 70 20 29 7b 0a 20 20 20 20 73 70 72 69  2!=p ){.    spri
15e0: 6e 74 66 28 7a 50 74 72 2c 20 22 30 78 22 20 50  ntf(zPtr, "0x" P
15f0: 54 52 5f 46 4d 54 2c 20 70 29 3b 0a 20 20 20 20  TR_FMT, p);.    
1600: 69 66 28 20 73 73 63 61 6e 66 28 7a 50 74 72 2c  if( sscanf(zPtr,
1610: 20 50 54 52 5f 46 4d 54 2c 20 26 70 32 29 21 3d   PTR_FMT, &p2)!=
1620: 31 20 7c 7c 20 70 32 21 3d 70 20 29 7b 0a 20 20  1 || p2!=p ){.  
1630: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1640: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
1650: 61 62 6c 65 20 74 6f 20 63 6f 6e 76 65 72 74 20  able to convert 
1660: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
1670: 74 72 69 6e 67 20 22 0a 20 20 20 20 20 20 20 20  tring ".        
1680: 20 22 69 6e 20 74 68 65 20 66 69 6c 65 20 22 20   "in the file " 
1690: 5f 5f 46 49 4c 45 5f 5f 20 22 20 69 6e 20 66 75  __FILE__ " in fu
16a0: 6e 63 74 69 6f 6e 20 6d 61 6b 65 50 6f 69 6e 74  nction makePoint
16b0: 65 72 53 74 72 28 29 2e 20 20 50 6c 65 61 73 65  erStr().  Please
16c0: 20 22 0a 20 20 20 20 20 20 20 20 20 22 72 65 70   ".         "rep
16d0: 6f 72 74 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ort this problem
16e0: 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 6d   to the SQLite m
16f0: 61 69 6c 69 6e 67 20 6c 69 73 74 20 6f 72 20 61  ailing list or a
1700: 73 20 61 20 6e 65 77 20 62 75 74 20 22 0a 20 20  s a new but ".  
1710: 20 20 20 20 20 20 20 22 72 65 70 6f 72 74 2e 20         "report. 
1720: 20 50 6c 65 61 73 65 20 70 72 6f 76 69 64 65 20   Please provide 
1730: 64 65 74 61 69 6c 65 64 20 69 6e 66 6f 72 6d 61  detailed informa
1740: 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f 77 20 79  tion about how y
1750: 6f 75 20 63 6f 6d 70 69 6c 65 64 20 22 0a 20 20  ou compiled ".  
1760: 20 20 20 20 20 20 20 22 53 51 4c 69 74 65 20 61         "SQLite a
1770: 6e 64 20 77 68 61 74 20 63 6f 6d 70 75 74 65 72  nd what computer
1780: 20 79 6f 75 20 61 72 65 20 72 75 6e 6e 69 6e 67   you are running
1790: 20 6f 6e 2e 22 2c 20 30 29 3b 0a 20 20 20 20 20   on.", 0);.     
17a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  R;.    }.  }.  r
17c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  ./*.** The callb
17e0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ack routine for 
17f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
1800: 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntf()..*/.static
1810: 20 69 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66   int exec_printf
1820: 5f 63 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  _cb(void *pArg, 
1830: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
1840: 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61  *argv, char **na
1850: 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69  me){.  Tcl_DStri
1860: 6e 67 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44  ng *str = (Tcl_D
1870: 53 74 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20  String*)pArg;.  
1880: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63  int i;..  if( Tc
1890: 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28  l_DStringLength(
18a0: 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  str)==0 ){.    f
18b0: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
18c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
18d0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
18e0: 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69  ment(str, name[i
18f0: 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e  ] ? name[i] : "N
1900: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
1910: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1920: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  gc; i++){.    Tc
1930: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
1940: 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76  lement(str, argv
1950: 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20  [i] ? argv[i] : 
1960: 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72  "NULL");.  }.  r
1970: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1980: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1990: 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44  3_exec_printf  D
19a0: 42 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e  B  FORMAT  STRIN
19b0: 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  G.**.** Invoke t
19c0: 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  he sqlite3_exec_
19d0: 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61  printf() interfa
19e0: 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65  ce using the ope
19f0: 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42  n database.** DB
1a00: 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68  .  The SQL is th
1a10: 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e  e string FORMAT.
1a20: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72    The format str
1a30: 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ing should conta
1a40: 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20  in.** one %s or 
1a50: 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74  %q.  STRING is t
1a60: 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65  he value inserte
1a70: 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e  d into %s or %q.
1a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a90: 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  est_exec_printf(
1aa0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
1ab0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ac0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1ad0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1ae0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1af0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1b00: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
1b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b20: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1b30: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
1b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1b50: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
1b60: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
1b70: 74 65 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  te *db;.  Tcl_DS
1b80: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
1b90: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1ba0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  r = 0;.  char zB
1bb0: 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72  uf[30];.  if( ar
1bc0: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
1bd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1be0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1bf0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1c00: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1c10: 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54       " DB FORMAT
1c20: 20 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20   STRING", 0);.  
1c30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c40: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1c50: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1c60: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1c70: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c80: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
1c90: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
1ca0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1cb0: 63 5f 70 72 69 6e 74 66 28 64 62 2c 20 61 72 67  c_printf(db, arg
1cc0: 76 5b 32 5d 2c 20 65 78 65 63 5f 70 72 69 6e 74  v[2], exec_print
1cd0: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
1ce0: 72 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 73  r, argv[3]);.  s
1cf0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
1d00: 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70  ", rc);.  Tcl_Ap
1d10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1d20: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  rp, zBuf);.  Tcl
1d30: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
1d40: 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54  nterp, rc==SQLIT
1d50: 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69  E_OK ? Tcl_DStri
1d60: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20  ngValue(&str) : 
1d70: 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zErr);.  Tcl_DSt
1d80: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
1d90: 20 20 69 66 28 20 7a 45 72 72 20 29 20 66 72 65    if( zErr ) fre
1da0: 65 28 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72  e(zErr);.  retur
1db0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1dc0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1dd0: 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
1de0: 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52  t  SEPARATOR  AR
1df0: 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a  G0  ARG1 ....**.
1e00: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66  ** Test the %z f
1e10: 6f 72 6d 61 74 20 6f 66 20 6d 70 72 69 6e 74 66  ormat of mprintf
1e20: 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70 6c  ().  Use multipl
1e30: 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c 6c  e mprintf() call
1e40: 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74 65  s to .** concate
1e50: 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f 75 67  nate arg0 throug
1e60: 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65 70  h argn using sep
1e70: 61 72 61 74 6f 72 20 61 73 20 74 68 65 20 73 65  arator as the se
1e80: 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74 75  parator..** Retu
1e90: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
1ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1eb0: 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20 76  t_mprintf_z(.  v
1ec0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1ed0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ee0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1ef0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f00: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f10: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f20: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1f30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f40: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f50: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1f60: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1f70: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1f80: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  */.){.  char *zR
1f90: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e 74  esult = 0;.  int
1fa0: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20   i;..  for(i=2; 
1fb0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1fc0: 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    zResult = sqli
1fd0: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 25 73  te3MPrintf("%z%s
1fe0: 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72  %s", zResult, ar
1ff0: 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b  gv[1], argv[i]);
2000: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
2010: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2020: 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73  zResult, 0);.  s
2030: 71 6c 69 74 65 46 72 65 65 28 7a 52 65 73 75 6c  qliteFree(zResul
2040: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
2050: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
2060: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 67 65  age:  sqlite3_ge
2070: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 20  t_table_printf  
2080: 44 42 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49  DB  FORMAT  STRI
2090: 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  NG.**.** Invoke 
20a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  the sqlite3_get_
20b0: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29 20 69  table_printf() i
20c0: 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74  nterface using t
20d0: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
20e0: 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c  .** DB.  The SQL
20f0: 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 20 46   is the string F
2100: 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d  ORMAT.  The form
2110: 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64  at string should
2120: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20   contain.** one 
2130: 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e  %s or %q.  STRIN
2140: 47 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  G is the value i
2150: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20  nserted into %s 
2160: 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63  or %q..*/.static
2170: 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f 74 61   int test_get_ta
2180: 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  ble_printf(.  vo
2190: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
21a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
21c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
21d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
21e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
21f0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2200: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2210: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2220: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2230: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2240: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2250: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  /.){.  sqlite *d
2260: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
2270: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
2280: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2290: 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 43  ;.  int nRow, nC
22a0: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65  ol;.  char **aRe
22b0: 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sult;.  int i;. 
22c0: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
22d0: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
22e0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
22f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2300: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2310: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2320: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
2330: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
2340: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2350: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2360: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2370: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
2380: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
2390: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
23a0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
23b0: 73 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  str);.  rc = sql
23c0: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70  ite3_get_table_p
23d0: 72 69 6e 74 66 28 64 62 2c 20 61 72 67 76 5b 32  rintf(db, argv[2
23e0: 5d 2c 20 26 61 52 65 73 75 6c 74 2c 20 26 6e 52  ], &aResult, &nR
23f0: 6f 77 2c 20 26 6e 43 6f 6c 2c 20 0a 20 20 20 20  ow, &nCol, .    
2400: 20 20 20 20 20 20 20 20 20 20 20 26 7a 45 72 72             &zErr
2410: 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 73 70  , argv[3]);.  sp
2420: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
2430: 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , rc);.  Tcl_App
2440: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2450: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  p, zBuf);.  if( 
2460: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2470: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
2480: 66 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a  f, "%d", nRow);.
2490: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c      Tcl_AppendEl
24a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
24b0: 75 66 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  uf);.    sprintf
24c0: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 43 6f  (zBuf, "%d", nCo
24d0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  l);.    Tcl_Appe
24e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
24f0: 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 66 6f 72  , zBuf);.    for
2500: 28 69 3d 30 3b 20 69 3c 28 6e 52 6f 77 2b 31 29  (i=0; i<(nRow+1)
2510: 2a 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  *nCol; i++){.   
2520: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
2530: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 61 52 65  ment(interp, aRe
2540: 73 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73 75 6c  sult[i] ? aResul
2550: 74 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  t[i] : "NULL");.
2560: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2570: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
2580: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  ment(interp, zEr
2590: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
25a0: 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 52 65  3_free_table(aRe
25b0: 73 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a 45 72  sult);.  if( zEr
25c0: 72 20 29 20 66 72 65 65 28 7a 45 72 72 29 3b 0a  r ) free(zErr);.
25d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
25f0: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
2600: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
2610: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
2620: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
2630: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
2640: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
2650: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61  atic int test_la
2660: 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64  st_rowid(.  void
2670: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2690: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26a0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26b0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26c0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
26d0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
26e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2700: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
2710: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2720: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2730: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
2740: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2750: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
2760: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2770: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2780: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2790: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
27a0: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
27b0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
27c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
27d0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
27e0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
27f0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2800: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
2810: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c  rintf(zBuf, "%ll
2820: 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d", sqlite3_last
2830: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
2840: 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
2850: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
2860: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
2870: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2880: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2890: 6c 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a  lite3_close DB.*
28a0: 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20  *.** Closes the 
28b0: 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
28c0: 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e  by sqlite3_open.
28d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
28e0: 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65  qlite_test_close
28f0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2900: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2910: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2920: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2930: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2940: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2950: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2970: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2980: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29a0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
29b0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
29c0: 69 74 65 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  ite *db;.  int r
29d0: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
29e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
29f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2a10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2a20: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
2a30: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
2a40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2a50: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2a60: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2a70: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
2a80: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2a90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
2aa0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
2ab0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
2ac0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2ad0: 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29   *)errorName(rc)
2ae0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
2af0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2b10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
2b20: 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e 63  _coalesce() func
2b30: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
2b40: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
2b50: 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  nt non-NULL argu
2b60: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
2b70: 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28  void ifnullFunc(
2b80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2b90: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
2ba0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
2bb0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  e **argv){.  int
2bc0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2bd0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
2be0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
2bf0: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
2c00: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b  type(argv[i]) ){
2c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2c20: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
2c30: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
2c40: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c  e_text(argv[i]),
2c50: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 53   -1,.          S
2c60: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
2c70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2c80: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2c90: 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e  * A structure in
2ca0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75  to which to accu
2cb0: 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a  mulate text..*/.
2cc0: 73 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20  struct dstr {.  
2cd0: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20  int nAlloc;  /* 
2ce0: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20  */.  int nUsed; 
2d00: 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20    /* Space used 
2d10: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
2d20: 20 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a    /* The space *
2d30: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  /.};../*.** Appe
2d40: 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74  nd text to a dst
2d50: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r.*/.static void
2d60: 20 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75   dstrAppend(stru
2d70: 63 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73  ct dstr *p, cons
2d80: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64  t char *z, int d
2d90: 69 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e  ivider){.  int n
2da0: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
2db0: 69 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e  if( p->nUsed + n
2dc0: 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63   + 2 > p->nAlloc
2dd0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e   ){.    char *zN
2de0: 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f  ew;.    p->nAllo
2df0: 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  c = p->nAlloc*2 
2e00: 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a  + n + 200;.    z
2e10: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
2e20: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
2e30: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  loc);.    if( zN
2e40: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
2e50: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b  qliteFree(p->z);
2e60: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  .      memset(p,
2e70: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
2e80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
2e90: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d 20     }.    p->z = 
2ea0: 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zNew;.  }.  if( 
2eb0: 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e 55  divider && p->nU
2ec0: 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  sed>0 ){.    p->
2ed0: 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  z[p->nUsed++] = 
2ee0: 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20 6d  divider;.  }.  m
2ef0: 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e  emcpy(&p->z[p->n
2f00: 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a  Used], z, n+1);.
2f10: 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b    p->nUsed += n;
2f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
2f30: 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 62  d for each callb
2f40: 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ack from sqlite3
2f50: 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61 74  ExecFunc.*/.stat
2f60: 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63 43  ic int execFuncC
2f70: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44  allback(void *pD
2f80: 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  ata, int argc, c
2f90: 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72  har **argv, char
2fa0: 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73   **NotUsed){.  s
2fb0: 74 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d 20  truct dstr *p = 
2fc0: 28 73 74 72 75 63 74 20 64 73 74 72 2a 29 70 44  (struct dstr*)pD
2fd0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ata;.  int i;.  
2fe0: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
2ff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
3000: 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  rgv[i]==0 ){.   
3010: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
3020: 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a 20   "NULL", ' ');. 
3030: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3040: 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61 72  dstrAppend(p, ar
3050: 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20 20  gv[i], ' ');.   
3060: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3070: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  0;.}../*.** Impl
3080: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
3090: 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 28  e x_sqlite_exec(
30a0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  ) function.  Thi
30b0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  s function takes
30c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72 67  .** a single arg
30d0: 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d 70  ument and attemp
30e0: 74 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  ts to execute th
30f0: 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20 53  at argument as S
3100: 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73  QL code..** This
3110: 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64 20   is illegal and 
3120: 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20 53  should set the S
3130: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c 61  QLITE_MISUSE fla
3140: 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  g on the databas
3150: 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61  e..**.** 2004-Ja
3160: 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20 63  n-07:  We have c
3170: 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20 6d  hanged this to m
3180: 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f 20  ake it legal to 
3190: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78 65  call sqlite3_exe
31a0: 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68  c().** from with
31b0: 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  in a function ca
31c0: 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69  ll.  .** .** Thi
31d0: 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c 61  s routine simula
31e0: 74 65 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  tes the effect o
31f0: 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68 72  f having two thr
3200: 65 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f 0a  eads attempt to.
3210: 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ** use the same 
3220: 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
3230: 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74  same time..*/.st
3240: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
3250: 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71 6c  3ExecFunc(.  sql
3260: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3270: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
3280: 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  gc,  .  sqlite3_
3290: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
32a0: 20 20 73 74 72 75 63 74 20 64 73 74 72 20 78 3b    struct dstr x;
32b0: 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c  .  memset(&x, 0,
32c0: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 73   sizeof(x));.  s
32d0: 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c  qlite3_exec((sql
32e0: 69 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  ite*)sqlite3_use
32f0: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c  r_data(context),
3300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
3310: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
3320: 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75  ]),.      execFu
3330: 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20  ncCallback, &x, 
3340: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  0);.  sqlite3_re
3350: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
3360: 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c  t, x.z, x.nUsed,
3370: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
3380: 54 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  T);.  sqliteFree
3390: 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (x.z);.}../*.** 
33a0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 74  Usage:  sqlite_t
33b0: 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  est_create_funct
33c0: 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c  ion DB.**.** Cal
33d0: 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72  l the sqlite3_cr
33e0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50  eate_function AP
33f0: 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64  I on the given d
3400: 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72  atabase in order
3410: 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20  .** to create a 
3420: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
3430: 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54 68  x_coalesce".  Th
3440: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
3450: 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 0a   the same thing.
3460: 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c 65  ** as the "coale
3470: 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20  sce" function.  
3480: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
3490: 73 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e 20  so registers an 
34a0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  SQL function.** 
34b0: 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65 5f  named "x_sqlite_
34c0: 65 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f 6b  exec" that invok
34d0: 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  es sqlite3_exec(
34e0: 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71 6c  ).  Invoking sql
34f0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 69  ite3_exec().** i
3500: 6e 20 74 68 69 73 20 77 61 79 20 69 73 20 69 6c  n this way is il
3510: 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e 20  legal recursion 
3520: 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73 65  and should raise
3530: 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   an SQLITE_MISUS
3540: 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20  E error..** The 
3550: 65 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c 61  effect is simila
3560: 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20 75  r to trying to u
3570: 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  se the same data
3580: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
3590: 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72 65  from.** two thre
35a0: 61 64 73 20 61 74 20 74 68 65 20 73 61 6d 65 20  ads at the same 
35b0: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  time..**.** The 
35c0: 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74  original motivat
35d0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ion for this rou
35e0: 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61  tine was to be a
35f0: 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a  ble to call the.
3600: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
3610: 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74  e_function funct
3620: 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72  ion while a quer
3630: 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73  y is in progress
3640: 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20   in order.** to 
3650: 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f  test the SQLITE_
3660: 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e  MISUSE detection
3670: 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69   logic..*/.stati
3680: 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74  c int test_creat
3690: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f  e_function(.  vo
36a0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
36b0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
36c0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
36d0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
36e0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
36f0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3700: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3710: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3720: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3730: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3740: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3750: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3760: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  /.){.  sqlite *d
3770: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  b;.  sqlite3_val
3780: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 65 78 74 65  ue *pVal;.  exte
3790: 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69  rn void Md5_Regi
37a0: 73 74 65 72 28 73 71 6c 69 74 65 2a 29 3b 0a 0a  ster(sqlite*);..
37b0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
37c0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
37d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
37e0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
37f0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3800: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49  [0],.       " FI
3810: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
3820: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3830: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
3840: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
3850: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
3860: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3870: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
3880: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
3890: 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22  db, "x_coalesce"
38a0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59  , -1, SQLITE_ANY
38b0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 69 66 6e 75  , 0, .      ifnu
38c0: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a  llFunc, 0, 0);..
38d0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c    /* Use the sql
38e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
38f0: 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72  tion16() API her
3900: 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75  e. Mainly for fu
3910: 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a  n, but also .  *
3920: 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  * because it is 
3930: 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68  not tested anywh
3940: 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 70  ere else. */.  p
3950: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
3960: 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74  ueNew();.  sqlit
3970: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
3980: 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74  al, -1, "x_sqlit
3990: 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54 45 5f  e_exec", SQLITE_
39a0: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
39b0: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
39c0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
39d0: 36 28 64 62 2c 20 73 71 6c 69 74 65 33 56 61 6c  6(db, sqlite3Val
39e0: 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
39f0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
3a00: 2c 0a 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54  ,.      1, SQLIT
3a10: 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71 6c  E_UTF16, db, sql
3a20: 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30 2c  ite3ExecFunc, 0,
3a30: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61   0);.  sqlite3Va
3a40: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
3a50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
3a70: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
3a80: 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67  he x_count() agg
3a90: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
3aa0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3ab0: 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e  ct CountCtx Coun
3ac0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75  tCtx;.struct Cou
3ad0: 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b  ntCtx {.  int n;
3ae0: 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .};.static void 
3af0: 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65  countStep(sqlite
3b00: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3b10: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
3b20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3b30: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
3b40: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
3b50: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3b60: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
3b70: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3b80: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
3b90: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
3ba0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
3bb0: 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20  [0]) ) && p ){. 
3bc0: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d     p->n++;.  }.}
3bd0: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
3be0: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  countFinalize(sq
3bf0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3c00: 6f 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74  ontext){.  Count
3c10: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
3c20: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
3c30: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
3c40: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
3c50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3c60: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20  nt(context, p ? 
3c70: 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a  p->n : 0);.}../*
3c80: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3c90: 74 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 61  te_test_create_a
3ca0: 67 67 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a  ggregate DB.**.*
3cb0: 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74  * Call the sqlit
3cc0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
3cd0: 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69  on API on the gi
3ce0: 76 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20  ven database in 
3cf0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61  order.** to crea
3d00: 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61  te a function na
3d10: 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20  med "x_count".  
3d20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
3d30: 65 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  es the same thin
3d40: 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 6d 64 35  g.** as the "md5
3d50: 73 75 6d 22 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  sum" function..*
3d60: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
3d70: 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72  l motivation for
3d80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
3d90: 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  s to be able to 
3da0: 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  call the.** sqli
3db0: 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65  te3_create_aggre
3dc0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68  gate function wh
3dd0: 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20 69  ile a query is i
3de0: 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72  n progress in or
3df0: 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74  der.** to test t
3e00: 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  he SQLITE_MISUSE
3e10: 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63   detection logic
3e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3e30: 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
3e40: 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e  egate(.  void *N
3e50: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
3e60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
3e70: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
3e80: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
3e90: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
3ea0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ec0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3ed0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3ee0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3ef0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3f00: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3f10: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
3f20: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
3f30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
3f40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
3f50: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
3f60: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
3f70: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
3f80: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
3f90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3fa0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
3fb0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
3fc0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
3fd0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3fe0: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72  OR;.  sqlite3_cr
3ff0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
4000: 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  , "x_count", 0, 
4010: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
4020: 30 2c 0a 20 20 20 20 20 20 63 6f 75 6e 74 53 74  0,.      countSt
4030: 65 70 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  ep,countFinalize
4040: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  );.  sqlite3_cre
4050: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
4060: 20 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53   "x_count", 1, S
4070: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
4080: 2c 0a 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65  ,.      countSte
4090: 70 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29  p,countFinalize)
40a0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
40b0: 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  K;.}..../*.** Us
40c0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
40d0: 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54  rintf_int FORMAT
40e0: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
40f0: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43   INTEGER.**.** C
4100: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
4110: 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61   three integer a
4120: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
4130: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
4140: 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f  printf_int(.  vo
4150: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4160: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4170: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4180: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4190: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
41a0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
41b0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
41c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
41d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
41e0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
41f0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
4200: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
4210: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c  /.){.  int a[3],
4220: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
4230: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
4240: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4250: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4260: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4270: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4280: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
4290: 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c  MAT INT INT INT\
42a0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
42b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
42c0: 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35  }.  for(i=2; i<5
42d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
42e0: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
42f0: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
4300: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
4310: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
4320: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4330: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
4340: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
4350: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4360: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
4370: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4380: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
4390: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
43a0: 20 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73   zNum represents
43b0: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
43c0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 36 34 2d   will fit in 64-
43d0: 62 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a  bits, then set.*
43e0: 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61  * *pValue to tha
43f0: 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65  t integer and re
4400: 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65  turn true.  Othe
4410: 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c  rwise return fal
4420: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4430: 74 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36  t sqlite3GetInt6
4440: 34 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  4(const char *zN
4450: 75 6d 2c 20 69 36 34 20 2a 70 56 61 6c 75 65 29  um, i64 *pValue)
4460: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  {.  if( sqlite3F
4470: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 4e 75 6d  itsIn64Bits(zNum
4480: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4490: 61 74 6f 69 36 34 28 7a 4e 75 6d 2c 20 70 56 61  atoi64(zNum, pVa
44a0: 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  lue);.    return
44b0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
44c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61   0;.}../*.** Usa
44d0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
44e0: 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41  intf_int64 FORMA
44f0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
4500: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
4510: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
4520: 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69  h three 64-bit i
4530: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
4540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4550: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
4560: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  nt64(.  void *No
4570: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4580: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4590: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
45a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
45b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
45c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
45f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4600: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4610: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4620: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4630: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4640: 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63  _int64 a[3];.  c
4650: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
4660: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
4670: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4680: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4690: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
46a0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
46b0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
46c0: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
46d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
46e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
46f0: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
4700: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
4710: 33 47 65 74 49 6e 74 36 34 28 61 72 67 76 5b 69  3GetInt64(argv[i
4720: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a 20  ], &a[i-2]) ){. 
4730: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
4740: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
4750: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  rgument is not a
4760: 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e   valid 64-bit in
4770: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
4780: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4790: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
47a0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
47b0: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
47c0: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
47d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
47e0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
47f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4800: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
4810: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
4820: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
4830: 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41  printf_str FORMA
4840: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
4850: 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  R STRING.**.** C
4860: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
4870: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
4880: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73  uments and one s
4890: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a  tring argument.*
48a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
48b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
48c0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
48d0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
48e0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
48f0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4900: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4910: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4920: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4930: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4940: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4950: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4970: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4980: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
4990: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72   a[3], i;.  char
49a0: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
49b0: 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20  4 || argc>5 ){. 
49c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
49d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
49e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
49f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4a00: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
4a10: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
4a20: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
4a30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4a40: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
4a50: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
4a60: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
4a70: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
4a80: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
4a90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4aa0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
4ab0: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
4ac0: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
4ad0: 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e  >4 ? argv[4] : N
4ae0: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
4af0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4b00: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
4b10: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
4b20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4b30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4b40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
4b50: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
4b60: 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a  INTEGER DOUBLE.*
4b70: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
4b80: 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67  f with two integ
4b90: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  er arguments and
4ba0: 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75   one double argu
4bb0: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ment.*/.static i
4bc0: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
4bd0: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
4be0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4bf0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4c00: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4c10: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4c20: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4c30: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
4c40: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4c50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4c60: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4c70: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4c80: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4c90: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4ca0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
4cb0: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
4cc0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
4cd0: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
4ce0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4cf0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4d00: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4d10: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
4d20: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
4d30: 4e 54 20 49 4e 54 20 53 54 52 49 4e 47 5c 22 22  NT INT STRING\""
4d40: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4d50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4d60: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
4d70: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
4d80: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
4d90: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
4da0: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
4db0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4dc0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
4dd0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
4de0: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
4df0: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
4e00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
4e10: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
4e20: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
4e30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4e40: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
4e50: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
4e60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4e70: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4e80: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
4e90: 72 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20  r FORMAT DOUBLE 
4ea0: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
4eb0: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61  l mprintf with a
4ec0: 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61   single double a
4ed0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
4ee0: 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20   the product of 
4ef0: 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d  the.** two argum
4f00: 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65  ents given above
4f10: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4f20: 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72  to generate over
4f30: 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c  flow and underfl
4f40: 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f  ow.** doubles to
4f50: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20   test that they 
4f60: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72  are converted pr
4f70: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  operly..*/.stati
4f80: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
4f90: 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20  rintf_scaled(.  
4fa0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4fb0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4fc0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4fd0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4fe0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4ff0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
5000: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
5010: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5020: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5030: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5040: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
5050: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5060: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5070: 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20    double r[2];. 
5080: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
5090: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
50a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
50b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
50c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
50d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
50e0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44        " FORMAT D
50f0: 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c  OUBLE DOUBLE\"",
5100: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5110: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5120: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
5130: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
5140: 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72  _GetDouble(inter
5150: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69  p, argv[i], &r[i
5160: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
5170: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
5180: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
5190: 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d  tf(argv[1], r[0]
51a0: 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70  *r[1]);.  Tcl_Ap
51b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
51c0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
51d0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
51e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
51f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
5200: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
5210: 20 4e 0a 2a 2a 0a 2a 2a 20 52 69 67 20 73 71 6c   N.**.** Rig sql
5220: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 74 6f 20 66  iteMalloc() to f
5230: 61 69 6c 20 6f 6e 20 74 68 65 20 4e 2d 74 68 20  ail on the N-th 
5240: 63 61 6c 6c 2e 20 20 54 75 72 6e 20 6f 66 66 20  call.  Turn off 
5250: 74 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  this mechanism.*
5260: 2a 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  * and reset the 
5270: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
5280: 61 69 6c 65 64 20 76 61 72 69 61 62 6c 65 20 69  ailed variable i
5290: 73 20 4e 3d 3d 30 2e 0a 2a 2f 0a 23 69 66 64 65  s N==0..*/.#ifde
52a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
52b0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
52c0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 28 0a 20 20  _malloc_fail(.  
52d0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
52e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
52f0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
5300: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
5310: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
5320: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
5330: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
5340: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5350: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5360: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5370: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
5380: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5390: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
53a0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
53b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
53c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
53d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
53e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
53f0: 5b 30 5d 2c 20 22 20 4e 5c 22 22 2c 20 30 29 3b  [0], " N\"", 0);
5400: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5410: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
5420: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
5430: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29  rp, argv[1], &n)
5440: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
5450: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ROR;.  sqlite3_i
5460: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6e 3b 0a  MallocFail = n;.
5470: 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63    sqlite3_malloc
5480: 5f 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 72  _failed = 0;.  r
5490: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
54a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
54b0: 61 67 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  age: sqlite_mall
54c0: 6f 63 5f 73 74 61 74 0a 2a 2a 0a 2a 2a 20 52 65  oc_stat.**.** Re
54d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
54e0: 6f 66 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  of prior calls t
54f0: 6f 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  o sqliteMalloc()
5500: 20 61 6e 64 20 73 71 6c 69 74 65 46 72 65 65 28   and sqliteFree(
5510: 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  )..*/.#ifdef SQL
5520: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5530: 20 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   int sqlite_mall
5540: 6f 63 5f 73 74 61 74 28 0a 20 20 76 6f 69 64 20  oc_stat(.  void 
5550: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5560: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5570: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5580: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5590: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
55a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
55b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
55c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
55d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
55e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
55f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
5600: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
5610: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  {.  char zBuf[20
5620: 30 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  0];.  sprintf(zB
5630: 75 66 2c 20 22 25 64 20 25 64 20 25 64 22 2c 20  uf, "%d %d %d", 
5640: 73 71 6c 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2c  sqlite3_nMalloc,
5650: 20 73 71 6c 69 74 65 33 5f 6e 46 72 65 65 2c 20   sqlite3_nFree, 
5660: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
5670: 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ail);.  Tcl_Appe
5680: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5690: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
56a0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
56b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ndif../*.** Usag
56c0: 65 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  e:  sqlite_abort
56d0: 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  .**.** Shutdown 
56e0: 74 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65  the process imme
56f0: 64 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69  diately.  This i
5700: 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68  s not a clean sh
5710: 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20  utdown..** This 
5720: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
5730: 74 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f  to test the reco
5740: 76 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20  verability of a 
5750: 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74  database in.** t
5760: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72  he event of a pr
5770: 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a  ogram crash..*/.
5780: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
5790: 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20  e_abort(.  void 
57a0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
57b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
57c0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
57d0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
57e0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
57f0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5800: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5810: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5820: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
5830: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
5840: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
5850: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
5860: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65  {.  assert( inte
5870: 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68  rp==0 );   /* Th
5880: 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  is will always f
5890: 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ail */.  return 
58a0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
58b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
58c0: 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72  outine is a user
58d0: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
58e0: 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70  ction whose purp
58f0: 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73  ose.** is to tes
5900: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74  t the sqlite_set
5910: 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a  _result() API..*
5920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
5930: 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  stFunc(sqlite3_c
5940: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5950: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5960: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
5970: 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e  {.  while( argc>
5980: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
5990: 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 73 71  char *zArg0 = sq
59a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
59b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
59c0: 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20  f( zArg0 ){.    
59d0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
59e0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22  StrICmp(zArg0, "
59f0: 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20  int") ){.       
5a00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5a10: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
5a20: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
5a30: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
5a40: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
5a50: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
5a60: 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20  int64")==0 ){.  
5a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5a80: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
5a90: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
5aa0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29  e_int64(argv[1])
5ab0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
5ac0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
5ad0: 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22  p(zArg0,"string"
5ae0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5af0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5b00: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
5b10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5b20: 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20  argv[1]), -1,.  
5b30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
5b40: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
5b50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
5b60: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
5b70: 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  0,"double")==0 )
5b80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5b90: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
5ba0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
5bb0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
5bc0: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
5bd0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
5be0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e  StrICmp(zArg0,"n
5bf0: 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
5c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5c10: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
5c20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5c30: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5c40: 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d  (zArg0,"value")=
5c50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5c60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
5c70: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
5c80: 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  [sqlite3_value_i
5c90: 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20  nt(argv[1])]);. 
5ca0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5cb0: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
5cc0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
5cd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
5ce0: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
5cf0: 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32   }.    argc -= 2
5d00: 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b  ;.    argv += 2;
5d10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  .  }.  return;..
5d20: 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
5d30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5d40: 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74  r(context,"first
5d50: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
5d60: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20   be one of: ".  
5d70: 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73      "int int64 s
5d80: 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c  tring double nul
5d90: 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d  l value", -1);.}
5da0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
5db0: 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72   sqlite_register
5dc0: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20  _test_function  
5dd0: 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  DB  NAME.**.** R
5de0: 65 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74  egister the test
5df0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e   SQL function on
5e00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
5e10: 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20   under the name 
5e20: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME..*/.static 
5e30: 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65  int test_registe
5e40: 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  r_func(.  void *
5e50: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
5e60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
5e70: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
5e80: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
5e90: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
5ea0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
5eb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5ec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
5ed0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
5ee0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
5ef0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
5f00: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
5f10: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
5f20: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
5f30: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
5f40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5f50: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
5f60: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
5f70: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
5f80: 20 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54        " DB FUNCT
5f90: 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20  ION-NAME", 0);. 
5fa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5fb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
5fc0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
5fd0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
5fe0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
5ff0: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
6000: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6010: 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
6020: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
6030: 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73  8, 0, .      tes
6040: 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  tFunc, 0, 0);.  
6050: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
6060: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6070: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
6080: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
60a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
60b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
60c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
60d0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53  ite3_finalize  S
60e0: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  TMT .**.** Final
60f0: 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ize a statement 
6100: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
6110: 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c  c int test_final
6120: 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ize(.  void * cl
6130: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
6140: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
6150: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
6160: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
6170: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
6180: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
6190: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
61a0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
61b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
61c0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
61d0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
61e0: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
61f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6200: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
6210: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
6220: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6230: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
6240: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
6250: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
6260: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
6270: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
6280: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
6290: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
62a0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ze(pStmt);.  Tcl
62b0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
62c0: 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72  p, (char *)error
62d0: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
62e0: 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
62f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
6300: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
6310: 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a  _reset  STMT .**
6320: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73  .** Finalize a s
6330: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
6340: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
6350: 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69  est_reset(.  voi
6360: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
6370: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6380: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
6390: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
63a0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
63b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
63c0: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
63d0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
63e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
63f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
6400: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
6410: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
6420: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
6430: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
6440: 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
6450: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6460: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
6470: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
6480: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
6490: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
64a0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
64b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
64c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
64d0: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
64e0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
64f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
6510: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
6520: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68  age:  sqlite3_ch
6530: 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52  anges DB.**.** R
6540: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6550: 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65   of changes made
6560: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6570: 20 62 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c   by the last SQL
6580: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  .** execution..*
6590: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
65a0: 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69  t_changes(.  voi
65b0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
65c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
65d0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
65e0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
65f0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
6600: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
6610: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
6620: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6630: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
6640: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
6650: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54  be \"",.       T
6660: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
6670: 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
6680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
6690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
66a0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
66b0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
66c0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
66d0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
66e0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
66f0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
6700: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
6710: 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73  (sqlite3_changes
6720: 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (db)));.  return
6730: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
6740: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 22 73  * This is the "s
6750: 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
6760: 22 20 74 68 61 74 20 76 61 72 69 61 62 6c 65 73  " that variables
6770: 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68   are bound to wh
6780: 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f  en.** the FLAG o
6790: 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ption of sqlite3
67a0: 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74 69 63  _bind is "static
67b0: 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ".*/.static char
67c0: 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   *sqlite_static_
67d0: 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a  bind_value = 0;.
67e0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
67f0: 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20  qlite3_bind  VM 
6800: 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41   IDX  VALUE  FLA
6810: 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68  GS.**.** Sets th
6820: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49  e value of the I
6830: 44 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65 20  DX-th occurance 
6840: 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72  of "?" in the or
6850: 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74  iginal SQL.** st
6860: 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20  ring.  VALUE is 
6870: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20  the new value.  
6880: 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22  If FLAGS=="null"
6890: 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a   then VALUE is.*
68a0: 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68  * ignored and th
68b0: 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
68c0: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47  o NULL.  If FLAG
68d0: 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e  S=="static" then
68e0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73  .** the value is
68f0: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
6900: 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61  e of a static va
6910: 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20  riable named.** 
6920: 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
6930: 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20  ind_value".  If 
6940: 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20  FLAGS=="normal" 
6950: 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  then a copy.** o
6960: 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d  f the VALUE is m
6970: 61 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ade..*/.static i
6980: 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20  nt test_bind(.  
6990: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
69a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
69b0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
69c0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
69d0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
69e0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
69f0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
6a00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6a10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
6a20: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
6a30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
6a40: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
6a50: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
6a60: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
6a70: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
6a80: 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  x;.  if( argc!=5
6a90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
6aa0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6ab0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
6ac0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
6ad0: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
6ae0: 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28  " VM IDX VALUE (
6af0: 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d  null|static|norm
6b00: 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  al)\"", 0);.    
6b10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6b20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
6b30: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
6b40: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74  p, argv[1], &pSt
6b50: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
6b60: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
6b70: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
6b80: 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20   argv[2], &idx) 
6b90: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6ba0: 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
6bb0: 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29  (argv[4],"null")
6bc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
6bd0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
6be0: 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
6bf0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
6c00: 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69  p(argv[4],"stati
6c10: 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  c")==0 ){.    rc
6c20: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
6c30: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
6c40: 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
6c50: 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30  ind_value, -1, 0
6c60: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
6c70: 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e  trcmp(argv[4],"n
6c80: 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  ormal")==0 ){.  
6c90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
6ca0: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
6cb0: 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31  idx, argv[3], -1
6cc0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
6cd0: 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
6ce0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6cf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20  lt(interp, "4th 
6d00: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
6d10: 62 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  be ".        "\"
6d20: 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74  null\" or \"stat
6d30: 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c  ic\" or \"normal
6d40: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
6d50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6d60: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
6d70: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d     char zBuf[50]
6d80: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
6d90: 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
6da0: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
6db0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
6dc0: 42 75 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53  Buf, sqlite3ErrS
6dd0: 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
6de0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
6e00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
6e10: 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
6e20: 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72  _collate <db ptr
6e30: 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
6e40: 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a  e> <utf16be>.**.
6e50: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6e60: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6e70: 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c   that SQLite sel
6e80: 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74  ects the correct
6e90: 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65   collation.** se
6ea0: 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20  quence callback 
6eb0: 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65  when multiple ve
6ec0: 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66  rsions (for diff
6ed0: 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64  erent text encod
6ee0: 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61  ings).** are ava
6ef0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61  ilable..**.** Ca
6f00: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6f10: 6e 65 20 72 65 67 69 73 74 65 72 73 20 74 68 65  ne registers the
6f20: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6f30: 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  nce "test_collat
6f40: 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62  e".** with datab
6f50: 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
6f60: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
6f70: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c  ment must be a l
6f80: 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20  ist of three.** 
6f90: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20  boolean values. 
6fa0: 49 66 20 74 68 65 20 66 69 72 73 74 20 69 73 20  If the first is 
6fb0: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
6fc0: 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c  sion of test_col
6fd0: 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73  late is.** regis
6fe0: 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c  tered for UTF-8,
6ff0: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69   if the second i
7000: 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
7010: 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
7020: 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c  for.** UTF-16le,
7030: 20 69 66 20 74 68 65 20 74 68 69 72 64 20 69 73   if the third is
7040: 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
7050: 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
7060: 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69  ilable..** Previ
7070: 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ous versions of 
7080: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65  test_collate are
7090: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
70a0: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
70b0: 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c  quence test_coll
70c0: 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ate is implement
70d0: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
70e0: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54  e.** following T
70f0: 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a  CL script:.**.**
7100: 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65     "test_collate
7110: 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68   <enc> <lhs> <rh
7120: 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c  s>".**.** The <l
7130: 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72  hs> and <rhs> ar
7140: 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
7150: 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c   being compared,
7160: 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d   encoded in UTF-
7170: 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20  8..** The <enc> 
7180: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
7190: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
71a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
71b0: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69  ion that.** SQLi
71c0: 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63  te selected to c
71d0: 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73  all. The TCL tes
71e0: 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65  t script impleme
71f0: 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74  nts the.** "test
7200: 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a  _collate" proc..
7210: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7220: 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77  this will only w
7230: 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74  ork with one int
7240: 65 70 72 65 74 65 72 20 61 74 20 61 20 74 69 6d  epreter at a tim
7250: 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74  e, as the.** int
7260: 65 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75  erp pointer to u
7270: 73 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69  se when evaluati
7280: 6e 67 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  ng the TCL scrip
7290: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a  t is stored in.*
72a0: 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  * pTestCollateIn
72b0: 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  terp..*/.static 
72c0: 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73  Tcl_Interp* pTes
72d0: 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
72e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
72f0: 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20  collate_func(.  
7300: 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69  void *pCtx, .  i
7310: 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nA, const voi
7320: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
7330: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a   const void *zB.
7340: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
7350: 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74  *i = pTestCollat
7360: 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65  eInterp;.  int e
7370: 6e 63 69 6e 20 3d 20 28 69 6e 74 29 70 43 74 78  ncin = (int)pCtx
7380: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
7390: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
73a0: 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Val;.  Tcl_Obj *
73b0: 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f  pX;..  pX = Tcl_
73c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
73d0: 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29  st_collate", -1)
73e0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
73f0: 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69  ount(pX);..  swi
7400: 74 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20  tch( encin ){.  
7410: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
7420: 46 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  F8:.      Tcl_Li
7430: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7440: 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
7450: 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22  tringObj("UTF-8"
7460: 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
7470: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7480: 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20  ITE_UTF16LE:.   
7490: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
74a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
74b0: 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
74c0: 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29  j("UTF-16LE",-1)
74d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
74e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
74f0: 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54  UTF16BE:.      T
7500: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7510: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
7520: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
7530: 54 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20  TF-16BE",-1));. 
7540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7550: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
7560: 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20  ssert(0);.  }.. 
7570: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
7580: 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c  alueNew();.  sql
7590: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
75a0: 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e  pVal, nA, zA, en
75b0: 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  cin, SQLITE_STAT
75c0: 49 43 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  IC);.  Tcl_ListO
75d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
75e0: 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
75f0: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ngObj(sqlite3_va
7600: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d  lue_text(pVal),-
7610: 31 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  1));.  sqlite3Va
7620: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
7630: 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53  nB, zB, encin, S
7640: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7650: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
7660: 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
7670: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7690: 78 74 28 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20  xt(pVal),-1));. 
76a0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
76b0: 65 28 70 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f  e(pVal);..  Tcl_
76c0: 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c  EvalObjEx(i, pX,
76d0: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
76e0: 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
76f0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
7700: 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  (i, Tcl_GetObjRe
7710: 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a  sult(i), &res);.
7720: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
7730: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
7740: 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  collate(.  void 
7750: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
7760: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7770: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
7780: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
7790: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
77a0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
77b0: 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  val;.  sqlite3_v
77c0: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 0a 20 20 69  alue *pVal;..  i
77d0: 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
77e0: 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54  o bad_args;.  pT
77f0: 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
7800: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28   = interp;.  if(
7810: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
7820: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
7830: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
7840: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
7850: 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43  ERROR;..  if( TC
7860: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
7870: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
7880: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
7890: 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
78a0: 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
78b0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
78c0: 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  n(db, "test_coll
78d0: 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
78e0: 38 2c 20 0a 20 20 20 20 20 20 20 20 28 76 6f 69  8, .        (voi
78f0: 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c  d *)SQLITE_UTF8,
7900: 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
7910: 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28  e_func:0);.  if(
7920: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
7930: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
7940: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
7950: 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
7960: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
7970: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
7980: 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
7990: 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
79a0: 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
79b0: 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
79c0: 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65  _UTF16LE, val?te
79d0: 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
79e0: 30 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  0);.  if( TCL_OK
79f0: 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
7a00: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7a10: 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29  objv[4], &val) )
7a20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7a30: 52 3b 0a 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  R;..  pVal = sql
7a40: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
7a50: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
7a60: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22  tStr(pVal, -1, "
7a70: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
7a80: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
7a90: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
7aa0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
7ab0: 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 73 71 6c  lation16(db, sql
7ac0: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
7ad0: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  al, SQLITE_UTF16
7ae0: 4e 41 54 49 56 45 29 2c 20 0a 20 20 20 20 20 20  NATIVE), .      
7af0: 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45    SQLITE_UTF16BE
7b00: 2c 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45  , (void *)SQLITE
7b10: 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65  _UTF16BE, val?te
7b20: 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
7b30: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
7b40: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
7b50: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7b60: 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
7b70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7b80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
7b90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
7ba0: 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
7bb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
7bc0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
7bd0: 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
7be0: 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
7bf0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
7c00: 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61  CL_ERROR;.}..sta
7c10: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f  tic void test_co
7c20: 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28  llate_needed_cb(
7c30: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
7c40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
7c50: 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
7c60: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 6e 6f 74   const void *not
7c70: 55 73 65 64 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  Used.){.  int en
7c80: 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 73  c = db->enc;.  s
7c90: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
7ca0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64  llation(.      d
7cb0: 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
7cc0: 22 2c 20 64 62 2d 3e 65 6e 63 2c 20 28 76 6f 69  ", db->enc, (voi
7cd0: 64 20 2a 29 65 6e 63 2c 20 74 65 73 74 5f 63 6f  d *)enc, test_co
7ce0: 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a  llate_func);.}..
7cf0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
7d00: 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65  _test_collate_ne
7d10: 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69  eded DB.*/.stati
7d20: 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61  c int test_colla
7d30: 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69  te_needed(.  voi
7d40: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
7d50: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7d60: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
7d70: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
7d80: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
7d90: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
7da0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74  f( objc!=2 ) got
7db0: 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
7dc0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
7dd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
7de0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
7df0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
7e00: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
7e10: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
7e20: 65 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74  ed16(db, 0, test
7e30: 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f  _collate_needed_
7e40: 63 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  cb);.  return TC
7e50: 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
7e60: 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
7e70: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
7e80: 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
7e90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
7eb0: 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
7ec0: 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38  n <db ptr> <utf8
7ed0: 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
7ee0: 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  16be>.**.** This
7ef0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
7f00: 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  d to test that S
7f10: 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68  QLite selects th
7f20: 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a  e correct user.*
7f30: 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62  * function callb
7f40: 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c  ack when multipl
7f50: 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20  e versions (for 
7f60: 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65  different text e
7f70: 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65  ncodings).** are
7f80: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
7f90: 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
7fa0: 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
7fb0: 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72   up to three ver
7fc0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65  sions of the use
7fd0: 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74  r function.** "t
7fe0: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69  est_function" wi
7ff0: 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
8000: 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65  le <db>.  If the
8010: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8020: 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
8030: 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
8040: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20  est_function is 
8050: 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
8060: 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20  TF-8, if the.** 
8070: 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
8080: 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
8090: 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31  stered for UTF-1
80a0: 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72  6le, if the four
80b0: 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61  th is.** true, a
80c0: 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
80d0: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  n is available. 
80e0: 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
80f0: 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75  ns of.** test_fu
8100: 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74  nction are delet
8110: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73  ed..**.** The us
8120: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
8130: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
8140: 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  lling the follow
8150: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
8160: 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75  **.**   "test_fu
8170: 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72  nction <enc> <ar
8180: 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  g>".**.** Where 
8190: 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20  <enc> is one of 
81a0: 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20  UTF-8, UTF-16LE 
81b0: 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20  or UTF16BE, and 
81c0: 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20  <arg> is the.** 
81d0: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
81e0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51  passed to the SQ
81f0: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  L function. The 
8200: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
8210: 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72  y.** the TCL scr
8220: 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74  ipt is used as t
8230: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
8240: 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  of the SQL funct
8250: 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61  ion. It.** is pa
8260: 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75  ssed to SQLite u
8270: 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f  sing UTF-16BE fo
8280: 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66  r a UTF-8 test_f
8290: 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38  unction(), UTF-8
82a0: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36  .** for a UTF-16
82b0: 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  LE test_function
82c0: 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45  (), and UTF-16LE
82d0: 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e   for an implemen
82e0: 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70  tation that.** p
82f0: 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e  refers UTF-16BE.
8300: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8310: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
8320: 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  f8(.  sqlite3_co
8330: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
8340: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
8350: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8360: 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
8370: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
8380: 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
8390: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
83a0: 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
83b0: 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
83c0: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
83d0: 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
83e0: 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
83f0: 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
8400: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
8410: 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
8420: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
8430: 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
8440: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8450: 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20  "UTF-8", -1));. 
8460: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8470: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8480: 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
8490: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
84a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
84b0: 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
84c0: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
84d0: 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
84e0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
84f0: 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74  unt(pX);.  sqlit
8500: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
8510: 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  Ctx, Tcl_GetStri
8520: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
8530: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
8540: 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20  NSIENT);.  pVal 
8550: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
8560: 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  w();.  sqlite3Va
8570: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
8580: 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
8590: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
85a0: 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
85b0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
85c0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
85d0: 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
85e0: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
85f0: 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c  ue_text16be(pVal
8600: 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
8610: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
8620: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
8630: 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
8640: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
8650: 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20  ction_utf16le(. 
8660: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8670: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
8680: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
8690: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
86a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
86b0: 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
86c0: 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
86d0: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
86e0: 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
86f0: 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
8700: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
8710: 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
8720: 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
8730: 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
8740: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
8750: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
8760: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8770: 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
8780: 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
8790: 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16LE", -1));.  T
87a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
87b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
87c0: 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
87d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
87e0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
87f0: 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20  rgv[0]), -1));. 
8800: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
8810: 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20  nterp, pX, 0);. 
8820: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
8830: 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20  t(pX);.  pVal = 
8840: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
8850: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
8860: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
8870: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
8880: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
8890: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
88a0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
88b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
88c0: 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 73 71  ult_text(pCtx,sq
88d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
88e0: 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45  (pVal),-1,SQLITE
88f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
8900: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
8910: 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pVal);.}.static 
8920: 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69  void test_functi
8930: 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71  on_utf16be(.  sq
8940: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
8950: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
8960: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
8970: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
8980: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8990: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
89a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
89b0: 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
89c0: 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
89d0: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
89e0: 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
89f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
8a00: 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
8a10: 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
8a20: 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
8a30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8a40: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8a50: 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
8a60: 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42  ringObj("UTF-16B
8a70: 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  E", -1));.  Tcl_
8a80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8a90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
8aa0: 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
8ab0: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
8ac0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8ad0: 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
8ae0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
8af0: 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
8b00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
8b10: 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  X);.  pVal = sql
8b20: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
8b30: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
8b40: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
8b50: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
8b60: 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
8b70: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
8b80: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
8b90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8ba0: 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20  _text16le(pCtx, 
8bb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8bc0: 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
8bd0: 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
8be0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
8bf0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
8c00: 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  al);.}.static in
8c10: 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  t test_function(
8c20: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
8c30: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
8c40: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
8c50: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
8c60: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
8c70: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8c80: 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20  ;.  int val;..  
8c90: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
8ca0: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
8cb0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
8cc0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
8cd0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
8ce0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
8cf0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
8d00: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
8d10: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
8d20: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
8d30: 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
8d40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
8d50: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
8d60: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8d70: 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
8d80: 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
8d90: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
8da0: 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
8db0: 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30  ction_utf8, 0, 0
8dc0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
8dd0: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
8de0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
8df0: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
8e00: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
8e10: 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
8e20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
8e30: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
8e40: 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
8e50: 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
8e60: 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
8e70: 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
8e80: 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30  ction_utf16le, 0
8e90: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
8ea0: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
8eb0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
8ec0: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
8ed0: 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
8ee0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
8ef0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
8f00: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8f10: 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
8f20: 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
8f30: 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
8f40: 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f     interp, test_
8f50: 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65  function_utf16be
8f60: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
8f70: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62  return TCL_OK;.b
8f80: 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
8f90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8fa0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8fb0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8fc0: 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
8fd0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8fe0: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
8ff0: 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
9000: 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
9010: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
9020: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  RROR;.}../*.** U
9030: 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 74 65  sage:         te
9040: 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63  st_errstr <err c
9050: 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ode>.**.** Test 
9060: 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68  that the english
9070: 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67   language string
9080: 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72   equivalents for
9090: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
90a0: 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e  des.** are sane.
90b0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   The parameter i
90c0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70  s an integer rep
90d0: 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c  resenting an sql
90e0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
90f0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
9100: 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65   a list of two e
9110: 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72  lements, the str
9120: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
9130: 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72  on of the.** err
9140: 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  or code and the 
9150: 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  english language
9160: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f   explanation..*/
9170: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
9180: 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20  _errstr(.  void 
9190: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
91a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
91b0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
91c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
91d0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61   objv[].){.  cha
91e0: 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20  r *zCode;.  int 
91f0: 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  i;.  if( objc!=1
9200: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
9210: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9220: 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f   1, objv, "<erro
9230: 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a  r code>");.  }..
9240: 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65    zCode = Tcl_Ge
9250: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
9260: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
9270: 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  00; i++){.    if
9280: 28 20 30 3d 3d 73 74 72 63 6d 70 28 65 72 72 6f  ( 0==strcmp(erro
9290: 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29  rName(i), zCode)
92a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
92b0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
92c0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
92d0: 6c 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20  lite3ErrStr(i), 
92e0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
92f0: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
9300: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 61 73 68  nt sqlite3_crash
9310: 70 61 72 61 6d 73 28 0a 20 20 76 6f 69 64 20 2a  params(.  void *
9320: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
9330: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9340: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
9350: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
9360: 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64 65 66  objv[].){.#ifdef
9370: 20 4f 53 5f 54 45 53 54 0a 20 20 69 6e 74 20 64   OS_TEST.  int d
9380: 65 6c 61 79 3b 0a 20 20 69 66 28 20 6f 62 6a 63  elay;.  if( objc
9390: 21 3d 33 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=3 ) goto bad_a
93a0: 72 67 73 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  rgs;.  if( Tcl_G
93b0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
93c0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 64  erp, objv[1], &d
93d0: 65 6c 61 79 29 20 29 20 72 65 74 75 72 6e 20 54  elay) ) return T
93e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
93f0: 74 65 33 53 65 74 43 72 61 73 68 50 61 72 61 6d  te3SetCrashParam
9400: 73 28 64 65 6c 61 79 2c 20 54 63 6c 5f 47 65 74  s(delay, Tcl_Get
9410: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
9420: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
9430: 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 23 69 66 64 65  n TCL_OK;..#ifde
9440: 66 20 4f 53 5f 54 45 53 54 0a 62 61 64 5f 61 72  f OS_TEST.bad_ar
9450: 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
9460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9470: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9480: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
9490: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
94a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
94b0: 20 30 29 2c 20 22 3c 64 65 6c 61 79 3e 20 3c 66   0), "<delay> <f
94c0: 69 6c 65 6e 61 6d 65 3e 22 2c 20 30 29 3b 0a 20  ilename>", 0);. 
94d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
94e0: 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  R;.#endif.}.../*
94f0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72  .** Usage:    br
9500: 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
9510: 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73  his routine exis
9520: 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f  ts for one purpo
9530: 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20  se - to provide 
9540: 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61  a place to put a
9550: 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77  .** breakpoint w
9560: 69 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e  ith GDB that can
9570: 20 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73   be triggered us
9580: 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54  ing TCL code.  T
9590: 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68  he use.** for th
95a0: 69 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72  is is when a par
95b0: 74 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69  ticular test fai
95c0: 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20  ls on (say) the 
95d0: 31 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e  1485th iteration
95e0: 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20  ..** In the TCL 
95f0: 74 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20  test script, we 
9600: 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b  can add code lik
9610: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
9620: 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20    if {$i==1485} 
9630: 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
9640: 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69   Then run testfi
9650: 78 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62  xture in the deb
9660: 75 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66  ugger and wait f
9670: 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e  or the breakpoin
9680: 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54  t to.** fire.  T
9690: 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62  hen additional b
96a0: 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62  reakpoints can b
96b0: 65 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64  e set to trace d
96c0: 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a  own the bug..*/.
96d0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
96e0: 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f  breakpoint(.  vo
96f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9700: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9710: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9720: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9730: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9740: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9750: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
9760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9770: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
9780: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
9790: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
97a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
97b0: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  /.){.  return TC
97c0: 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  L_OK;         /*
97d0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d   Do nothing */.}
97e0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
97f0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
9800: 74 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  t  STMT N VALUE.
9810: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
9820: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
9830: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
9840: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
9850: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
9860: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
9870: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
9880: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9890: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
98a0: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32  nd.** binds a 32
98b0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
98c0: 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
98d0: 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
98e0: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74  nt test_bind_int
98f0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
9900: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
9910: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
9920: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
9930: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
9940: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
9950: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
9960: 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75   idx;.  int valu
9970: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
9980: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
9990: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
99a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
99b0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
99c0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
99d0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
99e0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
99f0: 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
9a00: 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
9a10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9a20: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
9a30: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
9a40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9a50: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
9a60: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9a70: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
9a80: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
9a90: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
9aa0: 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
9ab0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
9ac0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
9ad0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
9ae0: 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
9af0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
9b00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
9b10: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78  d_int(pStmt, idx
9b20: 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
9b30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9b40: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9b50: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
9b60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9b70: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
9b80: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9b90: 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  64  STMT N VALUE
9ba0: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
9bb0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9bc0: 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
9bd0: 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
9be0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
9bf0: 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
9c00: 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
9c10: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
9c20: 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
9c30: 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
9c40: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
9c50: 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
9c60: 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
9c70: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
9c80: 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
9c90: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
9ca0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9cb0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
9cc0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
9cd0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
9ce0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
9cf0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34    int idx;.  i64
9d00: 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
9d10: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
9d20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9d30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9d40: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9d50: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
9d60: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
9d70: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9d80: 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
9d90: 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
9da0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9db0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
9dc0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
9dd0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
9de0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
9df0: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
9e00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
9e10: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
9e20: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
9e30: 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
9e40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
9e50: 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
9e60: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
9e70: 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
9e80: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9e90: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
9ea0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
9eb0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
9ec0: 75 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ue);.  if( rc!=S
9ed0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9ee0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9ef0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
9f00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
9f10: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
9f20: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20  e3_bind_double  
9f30: 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
9f40: 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
9f50: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
9f60: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
9f70: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
9f80: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
9f90: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
9fa0: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
9fb0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9fc0: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
9fd0: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34  nd.** binds a 64
9fe0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
9ff0: 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
a000: 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
a010: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75  nt test_bind_dou
a020: 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ble(.  void * cl
a030: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
a040: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
a050: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
a060: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
a070: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
a080: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
a090: 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c  int idx;.  doubl
a0a0: 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  e value;.  int r
a0b0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
a0c0: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
a0d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a0e0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
a0f0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
a100: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
a110: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
a120: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
a130: 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
a140: 20 20 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 0a 20 20 69 66 28 20  ROR;.  }..  if( 
a160: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
a170: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
a180: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
a190: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
a1a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
a1b0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
a1c0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
a1d0: 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
a1e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a1f0: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
a200: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
a210: 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
a220: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a230: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
a240: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
a250: 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  e(pStmt, idx, va
a260: 6c 75 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  lue);.  if( rc!=
a270: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a280: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a290: 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
a2a0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
a2b0: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
a2c0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54  e3_bind_null  ST
a2d0: 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  MT N.**.** Test 
a2e0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
a2f0: 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  _null interface.
a300: 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
a310: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
a320: 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
a330: 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
a340: 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
a350: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
a360: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
a370: 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  s a NULL to the 
a380: 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
a390: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
a3a0: 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a  d_null(.  void *
a3b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
a3c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a3d0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
a3e0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
a3f0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
a400: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
a410: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
a420: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
a430: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
a440: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a450: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
a460: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a470: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
a480: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a490: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
a4a0: 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20  TMT N", 0);.    
a4b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a4c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
a4d0: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
a4e0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
a4f0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
a500: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
a510: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
a520: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
a530: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
a540: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
a550: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
a560: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
a570: 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29  null(pStmt, idx)
a580: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
a590: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
a5a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a5b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
a5c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
a5d0: 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
a5e0: 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e  ind_text  STMT N
a5f0: 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
a600: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
a610: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69  ite3_bind_text i
a620: 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
a630: 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
a640: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
a650: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
a660: 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
a670: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a680: 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
a690: 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
a6a0: 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47  -8 string STRING
a6b0: 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
a6c0: 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
a6d0: 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20   BYTES bytes.** 
a6e0: 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  long..*/.static 
a6f0: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  int test_bind_te
a700: 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  xt(.  void * cli
a710: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
a720: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
a730: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
a740: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a750: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
a760: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
a770: 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
a780: 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
a790: 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
a7a0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
a7b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a7c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
a7d0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
a7e0: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
a7f0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
a800: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
a810: 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
a820: 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
a830: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a840: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
a850: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
a860: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
a870: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
a880: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
a890: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
a8a0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
a8b0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
a8c0: 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
a8d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a8e0: 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74   value = Tcl_Get
a8f0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
a900: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
a910: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a920: 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
a930: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a940: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
a950: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
a960: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
a970: 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
a980: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
a990: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a9a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
a9b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
a9c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a9d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a9e0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
a9f0: 65 78 74 31 36 20 20 53 54 4d 54 20 4e 20 53 54  ext16  STMT N ST
aa00: 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  RING BYTES.**.**
aa10: 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
aa20: 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e  3_bind_text16 in
aa30: 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
aa40: 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
aa50: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
aa60: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
aa70: 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
aa80: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
aa90: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
aaa0: 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d  .** binds a UTF-
aab0: 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47  16 string STRING
aac0: 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
aad0: 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
aae0: 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20   BYTES bytes.** 
aaf0: 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  long..*/.static 
ab00: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  int test_bind_te
ab10: 78 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  xt16(.  void * c
ab20: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
ab30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ab40: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
ab50: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ab60: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
ab70: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
ab80: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
ab90: 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
aba0: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
abb0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
abc0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
abd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
abe0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
abf0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
ac00: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
ac10: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
ac20: 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
ac30: 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29  VALUE BYTES", 0)
ac40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ac50: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
ac60: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
ac70: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
ac80: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
ac90: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
aca0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
acb0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
acc0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
acd0: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
ace0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
acf0: 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
ad00: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
ad10: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a  bj(objv[3], 0);.
ad20: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
ad30: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ad40: 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
ad50: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ad60: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
ad70: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
ad80: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f  (pStmt, idx, (vo
ad90: 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65  id *)value, byte
ada0: 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  s, SQLITE_TRANSI
adb0: 45 4e 54 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ENT);.  if( rc!=
adc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
add0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ade0: 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
adf0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
ae00: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
ae10: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 53 54  e3_bind_blob  ST
ae20: 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a  MT N DATA BYTES.
ae30: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
ae40: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
ae50: 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
ae60: 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
ae70: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
ae80: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
ae90: 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
aea0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
aeb0: 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
aec0: 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42  and.** binds a B
aed0: 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
aee0: 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69  ard.  The BLOB i
aef0: 73 20 42 59 54 45 53 20 62 79 74 65 73 20 69 6e  s BYTES bytes in
af00: 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
af10: 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 62   int test_bind_b
af20: 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
af30: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
af40: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
af50: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
af60: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
af70: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
af80: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
af90: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
afa0: 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
afb0: 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
afc0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
afd0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
afe0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
aff0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
b000: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
b010: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
b020: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
b030: 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44  , 0), " STMT N D
b040: 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  ATA BYTES", 0);.
b050: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b060: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
b070: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
b080: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
b090: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
b0a0: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
b0b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
b0c0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
b0d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
b0e0: 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
b0f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b100: 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74   value = Tcl_Get
b110: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
b120: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
b130: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
b140: 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
b150: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
b160: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
b170: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
b180: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
b190: 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
b1a0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
b1b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b1c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
b1d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b1e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
b1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
b200: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
b210: 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
b220: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
b230: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
b240: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
b250: 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72  ite3_* API.** er
b260: 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22  ror code. e.g. "
b270: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a  SQLITE_ERROR"..*
b280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
b290: 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69  t_errcode(.  voi
b2a0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
b2b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b2c0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
b2d0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
b2e0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
b2f0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
b300: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
b310: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b320: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
b330: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
b340: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
b350: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b360: 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
b370: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
b380: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
b390: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
b3a0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b3b0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b3c0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
b3d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
b3e0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b3f0: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
b400: 61 6d 65 28 73 71 6c 69 74 65 33 5f 65 72 72 63  ame(sqlite3_errc
b410: 6f 64 65 28 64 62 29 29 2c 20 30 29 3b 0a 20 20  ode(db)), 0);.  
b420: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
b430: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
b440: 20 74 65 73 74 5f 65 72 72 6d 73 67 20 44 42 0a   test_errmsg DB.
b450: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
b460: 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e  e UTF-8 represen
b470: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
b480: 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
b490: 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
b4a0: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
b4b0: 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f  3_* API call..*/
b4c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
b4d0: 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20  _errmsg(.  void 
b4e0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
b4f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b500: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
b510: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
b520: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
b530: 69 74 65 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  ite *db;.  const
b540: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20   char *zErr;..  
b550: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
b560: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b570: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
b580: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
b590: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
b5a0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
b5b0: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
b5c0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
b5d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
b5e0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
b5f0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
b600: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
b610: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
b620: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45  TCL_ERROR;..  zE
b630: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rr = sqlite3_err
b640: 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  msg(db);.  Tcl_S
b650: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b660: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
b670: 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b  gObj(zErr, -1));
b680: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b690: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
b6a0: 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31  :   test_errmsg1
b6b0: 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  6 DB.**.** Retur
b6c0: 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20 72 65  ns the UTF-16 re
b6d0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
b6e0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
b6f0: 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  e string for the
b700: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  .** most recent 
b710: 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61  sqlite3_* API ca
b720: 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62 79  ll. This is a by
b730: 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74 20  te array object 
b740: 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c  at the TCL .** l
b750: 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63  evel, and it inc
b760: 6c 75 64 65 73 20 74 68 65 20 30 78 30 30 20 30  ludes the 0x00 0
b770: 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 62  x00 terminator b
b780: 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20  ytes at the end 
b790: 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36  of the.** UTF-16
b7a0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
b7b0: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
b7c0: 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  sg16(.  void * c
b7d0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
b7e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b7f0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
b800: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
b810: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
b820: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
b830: 69 64 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20  id *zErr;.  int 
b840: 62 79 74 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62  bytes;..  if( ob
b850: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
b860: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b870: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
b880: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
b890: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
b8a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
b8b0: 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
b8c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b8d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
b8e0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
b8f0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b900: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
b910: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b920: 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
b930: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
b940: 64 62 29 3b 0a 20 20 62 79 74 65 73 20 3d 20 73  db);.  bytes = s
b950: 71 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c  qlite3utf16ByteL
b960: 65 6e 28 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20  en(zErr, -1);.  
b970: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
b980: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
b990: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72  ByteArrayObj(zEr
b9a0: 72 2c 20 62 79 74 65 73 29 29 3b 0a 20 20 72 65  r, bytes));.  re
b9b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
b9c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
b9d0: 69 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20  ite3_prepare DB 
b9e0: 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
b9f0: 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  r.**.** Compile 
ba00: 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
ba10: 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
ba20: 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
ba30: 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
ba40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
ba50: 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
ba60: 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
ba70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
ba80: 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
ba90: 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
baa0: 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
bab0: 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
bac0: 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
bad0: 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
bae0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
baf0: 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20   test_prepare(. 
bb00: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
bb10: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
bb20: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
bb30: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
bb40: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
bb50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
bb60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
bb70: 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
bb80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bb90: 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
bba0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
bbb0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
bbc0: 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
bbd0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
bbe0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
bbf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
bc00: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
bc10: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
bc20: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
bc30: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
bc40: 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
bc50: 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
bc60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bc70: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
bc80: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
bc90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
bca0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
bcb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bcc0: 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
bcd0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
bce0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
bcf0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
bd00: 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
bd10: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
bd20: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
bd30: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
bd40: 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
bd50: 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a  pStmt, &zTail);.
bd60: 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
bd70: 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
bd80: 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
bd90: 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d   bytes - (zTail-
bda0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
bdb0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
bdc0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
bdd0: 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
bde0: 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
bdf0: 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
be00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
be10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
be20: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
be30: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
be40: 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
be50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
be60: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
be70: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
be80: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
be90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
bea0: 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
beb0: 20 20 20 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e      if( makePoin
bec0: 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
bed0: 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
bee0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bef0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
bf00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
bf10: 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
bf20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
bf30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
bf40: 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73  te3_prepare DB s
bf50: 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
bf60: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
bf70: 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
bf80: 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
bf90: 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
bfa0: 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
bfb0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
bfc0: 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
bfd0: 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
bfe0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
bff0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
c000: 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
c010: 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
c020: 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
c030: 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
c040: 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
c050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c060: 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a  test_prepare16(.
c070: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
c080: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
c090: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
c0a0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
c0b0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
c0c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
c0d0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
c0e0: 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Sql;.  const voi
c0f0: 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  d *zTail = 0;.  
c100: 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d  Tcl_Obj *pTail =
c110: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
c120: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
c130: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
c140: 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
c150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c160: 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
c170: 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
c180: 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1a0: 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
c1b0: 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
c1c0: 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
c1d0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
c1e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c1f0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
c200: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
c210: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
c220: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
c230: 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
c240: 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
c250: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c260: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
c270: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
c280: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c290: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
c2a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c2b0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
c2c0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
c2d0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
c2e0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
c2f0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
c300: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
c310: 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
c320: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
c330: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
c340: 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
c350: 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
c360: 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 20  &pStmt, &zTail) 
c370: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
c380: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
c390: 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
c3a0: 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e   objlen = objlen
c3b0: 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d   - ((u8 *)zTail-
c3c0: 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d  (u8 *)zSql);.  }
c3d0: 65 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e  else{.    objlen
c3e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69   = 0;.  }.  pTai
c3f0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
c400: 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
c410: 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
c420: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
c430: 28 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f  (pTail);.  Tcl_O
c440: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
c450: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54  , objv[4], 0, pT
c460: 61 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ail, 0);.  Tcl_D
c470: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
c480: 6c 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  l);..  if( pStmt
c490: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 6b 65   ){.    if( make
c4a0: 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
c4b0: 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
c4c0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c4d0: 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  OR;.  }.  Tcl_Ap
c4e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c4f0: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
c500: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
c510: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
c520: 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e  lite3_open filen
c530: 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73  ame ?options-lis
c540: 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t?.*/.static int
c550: 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f   test_open(.  vo
c560: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
c570: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c580: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
c590: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
c5a0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
c5b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
c5c0: 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
c5d0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
c5e0: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
c5f0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
c600: 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
c610: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c620: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
c630: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
c640: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
c650: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
c660: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
c670: 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
c680: 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
c690: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c6a0: 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
c6b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c6c0: 62 6a 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20  bjv[1]);.  rc = 
c6d0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
c6e0: 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
c6f0: 0a 20 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74  .  if( makePoint
c700: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
c710: 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
c720: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
c730: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c740: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
c750: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
c760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
c770: 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  : sqlite3_open16
c780: 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
c790: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
c7a0: 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76  test_open16(.  v
c7b0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
c7c0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
c7d0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
c7e0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
c7f0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
c800: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
c810: 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
c820: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
c830: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
c840: 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
c850: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
c860: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c870: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
c880: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
c890: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
c8a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
c8b0: 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  " filename optio
c8c0: 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  ns-list", 0);.  
c8d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c8e0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65  OR;.  }..  zFile
c8f0: 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79  name = Tcl_GetBy
c900: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
c910: 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63  bjv[1], 0);.  rc
c920: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31   = sqlite3_open1
c930: 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  6(zFilename, &db
c940: 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d 61 6b 65  );.  .  if( make
c950: 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
c960: 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
c970: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c980: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
c990: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
c9a0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
c9b0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
c9c0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73  Usage: sqlite3_s
c9d0: 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41  tep STMT.**.** A
c9e0: 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65  dvance the state
c9f0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  ment to the next
ca00: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
ca10: 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20  int test_step(. 
ca20: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
ca30: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
ca40: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
ca50: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
ca60: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
ca70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
ca80: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
ca90: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
caa0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
cab0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cac0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
cad0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
cae0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
caf0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
cb00: 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
cb10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cb20: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
cb30: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
cb40: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
cb50: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
cb60: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
cb70: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
cb80: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
cb90: 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63  t);..  /* if( rc
cba0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26  !=SQLITE_DONE &&
cbb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
cbc0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
cbd0: 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  OR; */.  Tcl_Set
cbe0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
cbf0: 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65  char *)errorName
cc00: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
cc10: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
cc20: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
cc30: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  e3_column_count 
cc40: 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
cc50: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
cc60: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
cc70: 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
cc80: 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
cc90: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
cca0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20  column_count(.  
ccb0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
ccc0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
ccd0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
cce0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
ccf0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
cd00: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
cd10: 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
cd20: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
cd30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
cd40: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
cd50: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
cd60: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
cd70: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
cd80: 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
cd90: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
cda0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cdb0: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
cdc0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
cdd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
cde0: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
cdf0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ce00: 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
ce10: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
ce20: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
ce30: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
ce40: 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
ce50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ce60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ce70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
ce80: 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
ce90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
cea0: 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  ype of the data 
ceb0: 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
cec0: 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
ced0: 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
cee0: 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
cef0: 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
cf00: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
cf10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
cf20: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
cf30: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
cf40: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
cf50: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
cf60: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
cf70: 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   tp;..  if( objc
cf80: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
cf90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
cfa0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
cfb0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
cfc0: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
cfd0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
cfe0: 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
cff0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
d000: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d010: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
d020: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
d030: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d040: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
d050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d060: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
d070: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
d080: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
d090: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d0a0: 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c  ROR;..  tp = sql
d0b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
d0c0: 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
d0d0: 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20  switch( tp ){.  
d0e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
d0f0: 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63  TEGER: .      Tc
d100: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
d110: 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54  rp, "INTEGER", T
d120: 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
d130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
d140: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a  se SQLITE_NULL:.
d150: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
d160: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c  ult(interp, "NUL
d170: 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  L", TCL_STATIC);
d180: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
d190: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
d1a0: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  LOAT:.      Tcl_
d1b0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
d1c0: 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53  , "FLOAT", TCL_S
d1d0: 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
d1e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
d1f0: 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20  QLITE_TEXT:.    
d200: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
d210: 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20  interp, "TEXT", 
d220: 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
d230: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
d240: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
d250: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
d260: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c  sult(interp, "BL
d270: 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  OB", TCL_STATIC)
d280: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
d290: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
d2a0: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
d2b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
d2c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
d2d0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
d2e0: 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f  mn_int64 STMT co
d2f0: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
d300: 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
d310: 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
d320: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
d330: 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77   cast as an.** w
d340: 69 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74  ide (64-bit) int
d350: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
d360: 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
d370: 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
d380: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
d390: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d3a0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
d3b0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
d3c0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
d3d0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
d3e0: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34    int col;.  i64
d3f0: 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   iVal;..  if( ob
d400: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
d410: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d420: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
d430: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
d440: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
d450: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
d460: 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
d470: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
d480: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d490: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
d4a0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
d4b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d4c0: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
d4d0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d4e0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
d4f0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
d500: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
d510: 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
d520: 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d  ERROR;..  iVal =
d530: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d540: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c  int64(pStmt, col
d550: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
d560: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
d570: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
d580: 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  iVal));.  return
d590: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
d5a0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
d5b0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d  _column_blob STM
d5c0: 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
d5d0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
d5e0: 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  mn_blob(.  void 
d5f0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
d600: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d610: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
d620: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d630: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
d640: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
d650: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20  ;.  int col;..  
d660: 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74  int len;.  const
d670: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20   void *pBlob;.. 
d680: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
d690: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d6a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
d6b0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
d6c0: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
d6d0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
d6e0: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
d6f0: 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
d700: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d710: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
d720: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
d730: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
d740: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
d750: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
d760: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
d770: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
d780: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
d790: 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
d7a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
d7b0: 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
d7c0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
d7d0: 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 6c 65 6e 20  mt, col);.  len 
d7e0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
d7f0: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f  _bytes(pStmt, co
d800: 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
d810: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
d820: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
d830: 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b  bj(pBlob, len));
d840: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
d850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
d860: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
d870: 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c  _double STMT col
d880: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
d890: 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
d8a0: 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
d8b0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
d8c0: 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65  cast as a double
d8d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d8e0: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
d8f0: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
d900: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d910: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d920: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d930: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d940: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
d950: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
d960: 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65  nt col;.  double
d970: 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   rVal;..  if( ob
d980: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
d990: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d9a0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
d9b0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
d9c0: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
d9d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
d9e0: 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
d9f0: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
da00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
da10: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
da20: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
da30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
da40: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
da50: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
da60: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
da70: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
da80: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
da90: 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
daa0: 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d  ERROR;..  rVal =
dab0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
dac0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f  double(pStmt, co
dad0: 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
dae0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
daf0: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
db00: 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rVal));.  return
db10: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
db20: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
db30: 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54  _data_count STMT
db40: 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
db50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
db60: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
db70: 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
db80: 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
db90: 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61  ic int test_data
dba0: 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
dbb0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
dbc0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
dbd0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
dbe0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
dbf0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
dc00: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
dc10: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
dc20: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
dc30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
dc40: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
dc50: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
dc60: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
dc70: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
dc80: 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
dc90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
dca0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
dcb0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
dcc0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
dcd0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
dce0: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
dcf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
dd00: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
dd10: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
dd20: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
dd30: 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74  data_count(pStmt
dd40: 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
dd50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
dd60: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
dd70: 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
dd80: 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
dd90: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
dda0: 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
ddb0: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
ddc0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
ddd0: 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
dde0: 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
ddf0: 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  t test_stmt_utf8
de00: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
de10: 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  tData,        /*
de20: 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
de30: 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
de40: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a  to be invoke */.
de50: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
de60: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
de70: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
de80: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
de90: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
dea0: 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
deb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78   const char *(*x
dec0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
ded0: 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65  mt*, int) = clie
dee0: 6e 74 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  ntData;.  const 
def0: 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 69  char *zRet;..  i
df00: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
df10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
df20: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
df30: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
df40: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
df50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
df60: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
df70: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
df80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
df90: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
dfa0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
dfb0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
dfc0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
dfd0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
dfe0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
dff0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
e000: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
e010: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
e020: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52   TCL_ERROR;.  zR
e030: 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74  et = xFunc(pStmt
e040: 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52  , col);.  if( zR
e050: 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  et ){.    Tcl_Se
e060: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
e070: 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29  (char *)zRet, 0)
e080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
e090: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
e0a0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
e0b0: 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
e0c0: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
e0d0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
e0e0: 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
e0f0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
e100: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
e110: 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
e120: 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
e130: 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  nt test_stmt_utf
e140: 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
e150: 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
e160: 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
e170: 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
e180: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  o be invoked */.
e190: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e1a0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
e1b0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
e1c0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
e1d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
e1e0: 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
e1f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
e200: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
e210: 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76  ame16;.  const v
e220: 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  oid *(*xFunc)(sq
e230: 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
e240: 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ) = clientData;.
e250: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
e260: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
e270: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e280: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
e290: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
e2a0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e2b0: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
e2c0: 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
e2d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e2e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
e2f0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
e300: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
e310: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
e320: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
e330: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
e340: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
e350: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
e360: 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
e370: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e380: 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75  .  zName16 = xFu
e390: 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
e3a0: 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b    if( zName16 ){
e3b0: 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  .    pRet = Tcl_
e3c0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
e3d0: 7a 4e 61 6d 65 31 36 2c 20 73 71 6c 69 74 65 33  zName16, sqlite3
e3e0: 75 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 4e 61  utf16ByteLen(zNa
e3f0: 6d 65 31 36 2c 20 2d 31 29 2b 32 29 3b 0a 20 20  me16, -1)+2);.  
e400: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
e410: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
e420: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
e430: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e440: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
e450: 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20  column_int STMT 
e460: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
e470: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
e480: 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f  mn_bytes STMT co
e490: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
e4a0: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
e4b0: 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f  _bytes16 STMT co
e4c0: 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  lumn.**.*/.stati
e4d0: 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
e4e0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  int(.  void * cl
e4f0: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a 20  ientData,    /* 
e500: 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
e510: 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
e520: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  o be invoked */.
e530: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e540: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
e550: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
e560: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
e570: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
e580: 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
e590: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71   int (*xFunc)(sq
e5a0: 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
e5b0: 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ) = clientData;.
e5c0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
e5d0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
e5e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e5f0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
e600: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
e610: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e620: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
e630: 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
e640: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e650: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
e660: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
e670: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
e680: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
e690: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
e6a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
e6b0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
e6c0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
e6d0: 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
e6e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e6f0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
e700: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
e710: 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28  NewIntObj(xFunc(
e720: 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20  pStmt, col)));. 
e730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
e740: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
e750: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
e760: 61 64 57 72 69 74 65 20 3c 66 69 6c 65 6e 61 6d  adWrite <filenam
e770: 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e>.*/.static int
e780: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f   test_sqlite3OsO
e790: 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20  penReadWrite(.  
e7a0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
e7b0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
e7c0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
e7d0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
e7e0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
e7f0: 20 20 4f 73 46 69 6c 65 20 2a 20 70 46 69 6c 65    OsFile * pFile
e800: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
e810: 74 20 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20  t dummy;.  char 
e820: 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
e830: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
e840: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e850: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e860: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e870: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
e880: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
e890: 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
e8a0: 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
e8b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e8c0: 20 7d 0a 0a 20 20 70 46 69 6c 65 20 3d 20 73 71   }..  pFile = sq
e8d0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
e8e0: 66 28 4f 73 46 69 6c 65 29 29 3b 0a 20 20 72 63  f(OsFile));.  rc
e8f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
e900: 52 65 61 64 57 72 69 74 65 28 54 63 6c 5f 47 65  ReadWrite(Tcl_Ge
e910: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
e920: 2c 20 70 46 69 6c 65 2c 20 26 64 75 6d 6d 79 29  , pFile, &dummy)
e930: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e940: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
e950: 69 74 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a  iteFree(pFile);.
e960: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
e970: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
e980: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  *)errorName(rc),
e990: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
e9a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e9b0: 4f 52 3b 0a 20 20 7d 0a 20 20 6d 61 6b 65 50 6f  OR;.  }.  makePo
e9c0: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
e9d0: 20 7a 42 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20   zBuf, pFile);. 
e9e0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
e9f0: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
ea00: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
ea10: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
ea20: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 43  age:  sqlite3OsC
ea30: 6c 6f 73 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c  lose <file handl
ea40: 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e>.*/.static int
ea50: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43   test_sqlite3OsC
ea60: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  lose(.  void * c
ea70: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
ea80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ea90: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
eaa0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
eab0: 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65  jv[].){.  OsFile
eac0: 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   * pFile;.  int 
ead0: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
eae0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
eaf0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
eb00: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
eb10: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
eb20: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
eb30: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
eb40: 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20   " filehandle", 
eb50: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
eb60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
eb70: 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e   if( getFilePoin
eb80: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
eb90: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
eba0: 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20  ]), &pFile) ){. 
ebb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ebc0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
ebd0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
ebe0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
ebf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ec00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
ec10: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
ec20: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  errorName(rc), T
ec30: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
ec40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ec50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
ec60: 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74  ee(pFile);.  ret
ec70: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
ec80: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
ec90: 69 74 65 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65  ite3OsLock <file
eca0: 20 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79   handle> <lockty
ecb0: 70 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe>.*/.static in
ecc0: 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  t test_sqlite3Os
ecd0: 4c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63  Lock(.  void * c
ece0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
ecf0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ed00: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
ed10: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ed20: 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65  jv[].){.  OsFile
ed30: 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   * pFile;.  int 
ed40: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
ed50: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
ed60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ed70: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
ed80: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
ed90: 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65   .        Tcl_Ge
eda0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
edb0: 2c 20 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c  , .        " fil
edc0: 65 68 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c  ehandle (SHARED|
edd0: 52 45 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47  RESERVED|PENDING
ede0: 7c 45 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29  |EXCLUSIVE)", 0)
edf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ee00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
ee10: 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65  f( getFilePointe
ee20: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
ee30: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
ee40: 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  , &pFile) ){.   
ee50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ee60: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d  R;.  }..  if( 0=
ee70: 3d 73 74 72 63 6d 70 28 22 53 48 41 52 45 44 22  =strcmp("SHARED"
ee80: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
ee90: 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20  objv[2])) ){.   
eea0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
eeb0: 6f 63 6b 28 70 46 69 6c 65 2c 20 53 48 41 52 45  ock(pFile, SHARE
eec0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65  D_LOCK);.  }.  e
eed0: 6c 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d  lse if( 0==strcm
eee0: 70 28 22 52 45 53 45 52 56 45 44 22 2c 20 54 63  p("RESERVED", Tc
eef0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
ef00: 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20  [2])) ){.    rc 
ef10: 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
ef20: 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
ef30: 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73  LOCK);.  }.  els
ef40: 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28  e if( 0==strcmp(
ef50: 22 50 45 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47  "PENDING", Tcl_G
ef60: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
ef70: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  )) ){.    rc = s
ef80: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69  qlite3OsLock(pFi
ef90: 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  le, PENDING_LOCK
efa0: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
efb0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 45 58 43  ( 0==strcmp("EXC
efc0: 4c 55 53 49 56 45 22 2c 20 54 63 6c 5f 47 65 74  LUSIVE", Tcl_Get
efd0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
efe0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
eff0: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65  ite3OsLock(pFile
f000: 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
f010: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f020: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f030: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
f040: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
f050: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  e \"", .        
f060: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f070: 6a 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20  jv[0]), .       
f080: 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53   " filehandle (S
f090: 48 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50  HARED|RESERVED|P
f0a0: 45 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45  ENDING|EXCLUSIVE
f0b0: 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  )", 0);.    retu
f0c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f0d0: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
f0e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
f0f0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f100: 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f  rp, (char *)erro
f110: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
f120: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
f130: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f140: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
f150: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
f160: 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  e:  sqlite3OsUnl
f170: 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65  ock <file handle
f180: 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
f190: 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e  test_sqlite3OsUn
f1a0: 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63  lock(.  void * c
f1b0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
f1c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
f1d0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
f1e0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
f1f0: 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65  jv[].){.  OsFile
f200: 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   * pFile;.  int 
f210: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
f220: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
f230: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f240: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
f250: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
f260: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
f270: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
f280: 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20   " filehandle", 
f290: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
f2a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
f2b0: 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e   if( getFilePoin
f2c0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
f2d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f2e0: 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20  ]), &pFile) ){. 
f2f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f300: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
f310: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
f320: 70 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  pFile, NO_LOCK);
f330: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f340: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
f350: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
f360: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
f370: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
f380: 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
f390: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
f3a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f3b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
f3c0: 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74  ter commands wit
f3d0: 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
f3e0: 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71  reter..*/.int Sq
f3f0: 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
f400: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
f410: 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  p){.  extern int
f420: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
f430: 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
f440: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  int sqlite3_inte
f450: 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65  rrupt_count;.  e
f460: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
f470: 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  3_open_file_coun
f480: 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
f490: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
f4a0: 74 69 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 73  time;.  static s
f4b0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
f4c0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
f4d0: 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  cl_CmdProc *xPro
f4e0: 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20  c;.  } aCmd[] = 
f4f0: 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  {.     { "sqlite
f500: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  3_mprintf_int", 
f510: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
f520: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
f530: 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d  mprintf_int    }
f540: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
f550: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22  3_mprintf_int64"
f560: 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ,         (Tcl_C
f570: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
f580: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d  mprintf_int64  }
f590: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
f5a0: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20  3_mprintf_str", 
f5b0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
f5c0: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
f5d0: 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d  mprintf_str    }
f5e0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
f5f0: 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
f600: 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
f610: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
f620: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d  mprintf_double }
f630: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
f640: 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
f650: 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
f660: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
f670: 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d  mprintf_scaled }
f680: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
f690: 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
f6a0: 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
f6b0: 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
f6c0: 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c  intf_z        },
f6d0: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
f6e0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
f6f0: 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d  id",     (Tcl_Cm
f700: 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74  dProc*)test_last
f710: 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a  _rowid       },.
f720: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
f730: 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20  exec_printf",   
f740: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
f750: 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
f760: 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20  printf      },. 
f770: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
f780: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22  et_table_printf"
f790: 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
f7a0: 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61  roc*)test_get_ta
f7b0: 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20 20  ble_printf },.  
f7c0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
f7d0: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
f7e0: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
f7f0: 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
f800: 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20  close     },.   
f810: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
f820: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ate_function",  
f830: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
f840: 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66  c*)test_create_f
f850: 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20  unction  },.    
f860: 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
f870: 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20  te_aggregate",  
f880: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
f890: 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  *)test_create_ag
f8a0: 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20  gregate },.     
f8b0: 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74  { "sqlite_regist
f8c0: 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
f8d0: 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
f8e0: 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66  )test_register_f
f8f0: 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  unc    },.     {
f900: 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c   "sqlite_abort",
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
f930: 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20  sqlite_abort    
f940: 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20        },.#ifdef 
f950: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
f960: 20 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c    { "sqlite_mall
f970: 6f 63 5f 66 61 69 6c 22 2c 20 20 20 20 20 20 20  oc_fail",       
f980: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
f990: 63 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  c*)sqlite_malloc
f9a0: 5f 66 61 69 6c 20 20 20 20 7d 2c 0a 20 20 20 20  _fail    },.    
f9b0: 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   { "sqlite_mallo
f9c0: 63 5f 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  c_stat",        
f9d0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
f9e0: 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  *)sqlite_malloc_
f9f0: 73 74 61 74 20 20 20 20 7d 2c 0a 23 65 6e 64 69  stat    },.#endi
fa00: 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
fa10: 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20  _bind",         
fa20: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
fa30: 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69  CmdProc*)test_bi
fa40: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  nd             }
fa50: 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70  ,.     { "breakp
fa60: 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  oint",          
fa70: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
fa80: 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72  CmdProc*)test_br
fa90: 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d  eakpoint       }
faa0: 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
fab0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
fac0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
fad0: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a  Tcl_ObjCmdProc *
fae0: 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64  xProc;.     void
faf0: 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20   *clientData;.  
fb00: 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a  } aObjCmd[] = {.
fb10: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
fb20: 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20  bind_int",      
fb30: 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
fb40: 64 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c  d_int,      0 },
fb50: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
fb60: 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20  _bind_int64",   
fb70: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
fb80: 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d  nd_int64,    0 }
fb90: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
fba0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20  3_bind_double", 
fbb0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
fbc0: 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20  ind_double,   0 
fbd0: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
fbe0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20  e3_bind_null",  
fbf0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
fc00: 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30  bind_null     ,0
fc10: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
fc20: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20  te3_bind_text", 
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
fc40: 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c  _bind_text     ,
fc50: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
fc60: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
fc70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
fc80: 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20  t_bind_text16   
fc90: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
fca0: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22  lite3_bind_blob"
fcb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
fcc0: 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20  st_bind_blob    
fcd0: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
fce0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcode",
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
fd00: 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20  est_errcode     
fd10: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
fd20: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c  sqlite3_errmsg",
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd40: 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20  test_errmsg     
fd50: 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
fd60: 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  "sqlite3_errmsg1
fd70: 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
fd80: 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20   test_errmsg16  
fd90: 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
fda0: 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c   "sqlite3_open",
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20    test_open     
fdd0: 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
fde0: 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  { "sqlite3_open1
fdf0: 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
fe00: 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20     test_open16  
fe10: 20 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20        ,0 },..   
fe20: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
fe30: 70 61 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  pare",          
fe40: 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
fe50: 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e       ,0 },.  
fe60: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
fe70: 65 70 61 72 65 31 36 22 2c 20 20 20 20 20 20 20  epare16",       
fe80: 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
fe90: 72 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20  re16     ,0 },. 
fea0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66      { "sqlite3_f
feb0: 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20  inalize",       
fec0: 20 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61         test_fina
fed0: 6c 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a  lize      ,0 },.
fee0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
fef0: 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20  reset",         
ff00: 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73          test_res
ff10: 65 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  et         ,0 },
ff20: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
ff30: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  _changes",      
ff40: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 68           test_ch
ff50: 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d  anges       ,0 }
ff60: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
ff70: 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20 20  3_step",        
ff80: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
ff90: 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30 20  tep          ,0 
ffa0: 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69  },..     /* sqli
ffb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41  te3_column_*() A
ffc0: 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71  PI */.     { "sq
ffd0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
ffe0: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  nt",          te
fff0: 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  st_column_count 
10000 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
10010 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
10020 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  t",            t
10030 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20  est_data_count  
10040 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
10050 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
10060 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
10070 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  test_column_type
10080 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
10090 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
100a0 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  blob",          
100b0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f   test_column_blo
100c0 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  b   ,0 },.     {
100d0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
100e0 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
100f0 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f    test_column_do
10100 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20  uble ,0 },.     
10110 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
10120 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  n_int64",       
10130 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69     test_column_i
10140 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20  nt64  ,0 },.    
10150 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
10160 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  mn_int",        
10170 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
10180 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10190 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  int       },.   
101a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
101b0 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 20 20 20  umn_bytes",     
101c0 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
101d0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
101e0 5f 62 79 74 65 73 20 20 20 20 20 7d 2c 0a 20 20  _bytes     },.  
101f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
10200 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20  lumn_bytes16",  
10210 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c    test_stmt_int,
10220 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
10230 6e 5f 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20  n_bytes16   },. 
10240 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
10250 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 20  olumn_text",    
10260 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
10270 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  8,  sqlite3_colu
10280 6d 6e 5f 74 65 78 74 20 20 20 20 20 20 7d 2c 0a  mn_text      },.
10290 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
102a0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22  column_decltype"
102b0 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ,   test_stmt_ut
102c0 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  f8,  sqlite3_col
102d0 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 20 7d 2c  umn_decltype  },
102e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
102f0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20  _column_name",  
10300 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75       test_stmt_u
10310 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f  tf8,  sqlite3_co
10320 6c 75 6d 6e 5f 6e 61 6d 65 20 20 20 20 20 20 7d  lumn_name      }
10330 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
10340 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22  3_column_text16"
10350 2c 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  ,     test_stmt_
10360 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63  utf16, sqlite3_c
10370 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 20 20 20 20  olumn_text16    
10380 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
10390 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
103a0 70 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  pe16", test_stmt
103b0 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f  _utf16, sqlite3_
103c0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31  column_decltype1
103d0 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  6},.     { "sqli
103e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
103f0 36 22 2c 20 20 20 20 20 74 65 73 74 5f 73 74 6d  6",     test_stm
10400 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33  t_utf16, sqlite3
10410 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 20 20  _column_name16  
10420 20 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75    },..     /* Fu
10430 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e  nctions from os.
10440 68 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c  h */.     { "sql
10450 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
10460 69 74 65 22 2c 74 65 73 74 5f 73 71 6c 69 74 65  ite",test_sqlite
10470 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
10480 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
10490 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 22 2c 20  qlite3OsClose", 
104a0 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69         test_sqli
104b0 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30 20 7d 2c  te3OsClose, 0 },
104c0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
104d0 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20 20 20 20  OsLock",        
104e0 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c   test_sqlite3OsL
104f0 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20 0a 20 20  ock, 0 },.   .  
10500 20 20 20 2f 2a 20 43 75 73 74 6f 6d 20 74 65 73     /* Custom tes
10510 74 20 69 6e 74 65 72 66 61 63 65 73 20 2a 2f 0a  t interfaces */.
10520 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f       { "sqlite3O
10530 73 55 6e 6c 6f 63 6b 22 2c 20 20 20 20 20 20 20  sUnlock",       
10540 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73    test_sqlite3Os
10550 55 6e 6c 6f 63 6b 2c 20 30 20 20 20 20 7d 2c 0a  Unlock, 0    },.
10560 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
10570 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20  _collate",      
10580 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20    test_collate, 
10590 30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  0            },.
105a0 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
105b0 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22  _collate_needed"
105c0 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  , test_collate_n
105d0 65 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a  eeded, 0     },.
105e0 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
105f0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  _function",     
10600 20 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c    test_function,
10610 20 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a   0           },.
10620 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10630 63 72 61 73 68 70 61 72 61 6d 73 22 2c 20 20 20  crashparams",   
10640 20 20 73 71 6c 69 74 65 33 5f 63 72 61 73 68 70    sqlite3_crashp
10650 61 72 61 6d 73 2c 20 30 20 20 20 20 20 7d 2c 0a  arams, 0     },.
10660 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10670 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20  test_errstr",   
10680 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30    test_errstr, 0
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
106a0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
106b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
106c0 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b 0a 0a 20  te3_os_trace;.. 
106d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
106e0 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28  of(aCmd)/sizeof(
106f0 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aCmd[0]); i++){.
10700 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f      Tcl_CreateCo
10710 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43  mmand(interp, aC
10720 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d  md[i].zName, aCm
10730 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30  d[i].xProc, 0, 0
10740 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
10750 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43  ; i<sizeof(aObjC
10760 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43  md)/sizeof(aObjC
10770 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
10780 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
10790 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
107a0 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ObjCmd[i].zName,
107b0 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d   .        aObjCm
107c0 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a  d[i].xProc, aObj
107d0 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74  Cmd[i].clientDat
107e0 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  a, 0);.  }.  Tcl
107f0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
10800 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f   "sqlite_search_
10810 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
10820 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
10830 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c  earch_count, TCL
10840 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
10850 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
10860 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72  , "sqlite_interr
10870 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  upt_count", .   
10880 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
10890 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
108a0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
108b0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
108c0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
108d0 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
108e0 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
108f0 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66  )&sqlite3_open_f
10900 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ile_count, TCL_L
10910 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
10920 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
10930 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f  "sqlite_current_
10940 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63  time", .      (c
10950 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75  har*)&sqlite3_cu
10960 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f  rrent_time, TCL_
10970 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
10980 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
10990 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63   "sqlite_os_trac
109a0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
109b0 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61  )&sqlite3_os_tra
109c0 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
109d0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
109e0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
109f0 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
10a00 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
10a10 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
10a20 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
10a30 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
10a40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10a50 7d 0a                                            }.