/ Hex Artifact Content
Login

Artifact fcf1a914c27f50d93a41e0b90890008c3ea28cbc:


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 38 37 20 32 30 30 34 2f 30 36 2f  ,v 1.87 2004/06/
0240: 32 35 20 30 31 3a 31 30 3a 34 38 20 64 72 68 20  25 01:10:48 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 65 78  ;.int sqlite3_ex
04b0: 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 73 71 6c  ec_printf(.  sql
04c0: 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20  ite *db,        
04d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
04e0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a   open database *
04f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0500: 73 71 6c 46 6f 72 6d 61 74 2c 20 20 20 20 20 20  sqlFormat,      
0510: 20 20 2f 2a 20 70 72 69 6e 74 66 2d 73 74 79 6c    /* printf-styl
0520: 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  e format string 
0530: 66 6f 72 20 74 68 65 20 53 51 4c 20 2a 2f 0a 20  for the SQL */. 
0540: 20 73 71 6c 69 74 65 5f 63 61 6c 6c 62 61 63 6b   sqlite_callback
0550: 20 78 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 2f   xCallback,    /
0560: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
0570: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
0580: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
0590: 20 20 20 20 20 20 20 2f 2a 20 31 73 74 20 61 72         /* 1st ar
05a0: 67 75 6d 65 6e 74 20 74 6f 20 63 61 6c 6c 62 61  gument to callba
05b0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
05c0: 20 63 68 61 72 20 2a 2a 65 72 72 6d 73 67 2c 20   char **errmsg, 
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
05e0: 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
05f0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 2e 2e  ten here */.  ..
0600: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0620: 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
0630: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 2a  format string. *
0640: 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  /.);.int sqlite3
0650: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
0660: 66 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  f(.  sqlite *db,
0670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0680: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
0690: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
06a0: 2a 73 71 6c 46 6f 72 6d 61 74 2c 20 2f 2a 20 70  *sqlFormat, /* p
06b0: 72 69 6e 74 66 2d 73 74 79 6c 65 20 66 6f 72 6d  rintf-style form
06c0: 61 74 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  at string for th
06d0: 65 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20  e SQL */.  char 
06e0: 2a 2a 2a 72 65 73 75 6c 74 70 2c 20 20 20 20 20  ***resultp,     
06f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 77 72 69 74    /* Result writ
0700: 74 65 6e 20 74 6f 20 61 20 63 68 61 72 20 2a 5b  ten to a char *[
0710: 5d 20 20 74 68 61 74 20 74 68 69 73 20 70 6f 69  ]  that this poi
0720: 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  nts to */.  int 
0730: 2a 6e 72 6f 77 2c 20 20 20 20 20 20 20 20 20 20  *nrow,          
0740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0750: 72 65 73 75 6c 74 20 72 6f 77 73 20 77 72 69 74  result rows writ
0760: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
0770: 74 20 2a 6e 63 6f 6c 2c 20 20 20 20 20 20 20 20  t *ncol,        
0780: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0790: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
07a0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
07b0: 0a 20 20 63 68 61 72 20 2a 2a 65 72 72 6d 73 67  .  char **errmsg
07c0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72  ,         /* Err
07d0: 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68  or msg written h
07e0: 65 72 65 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20  ere */.  ...    
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0800: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
0810: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
0820: 67 20 2a 2f 0a 29 3b 0a 0a 73 74 61 74 69 63 20  g */.);..static 
0830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 65 72 72  const char * err
0840: 6f 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a  orName(int rc){.
0850: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
0860: 61 6d 65 20 3d 20 30 3b 0a 20 20 73 77 69 74 63  ame = 0;.  switc
0870: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73  h( rc ){.    cas
0880: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
0890: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
08a0: 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20  LITE_OK";       
08b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
08c0: 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a  se SQLITE_ERROR:
08d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
08e0: 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20  QLITE_ERROR";   
08f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0900: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
0910: 4e 41 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  NAL:   zName = "
0920: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22  SQLITE_INTERNAL"
0930: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
0940: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d  case SQLITE_PERM
0950: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
0960: 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20  "SQLITE_PERM";  
0970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0980: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
0990: 52 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  RT:      zName =
09a0: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b   "SQLITE_ABORT";
09b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
09c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
09d0: 53 59 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  SY:       zName 
09e0: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
09f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0a00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
0a10: 4f 43 4b 45 44 3a 20 20 20 20 20 7a 4e 61 6d 65  OCKED:     zName
0a20: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
0a30: 44 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  D";      break;.
0a40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0a50: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 4e 61 6d  NOMEM:      zNam
0a60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  e = "SQLITE_NOME
0a70: 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  M";       break;
0a80: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0a90: 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 4e 61  _READONLY:   zNa
0aa0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
0ab0: 44 4f 4e 4c 59 22 3b 20 20 20 20 62 72 65 61 6b  DONLY";    break
0ac0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0ad0: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 7a 4e  E_INTERRUPT:  zN
0ae0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
0af0: 54 45 52 52 55 50 54 22 3b 20 20 20 62 72 65 61  TERRUPT";   brea
0b00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0b10: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 7a  TE_IOERR:      z
0b20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
0b30: 4f 45 52 52 22 3b 20 20 20 20 20 20 20 62 72 65  OERR";       bre
0b40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0b50: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
0b60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0b70: 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 62 72  CORRUPT";     br
0b80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0b90: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20  LITE_NOTFOUND:  
0ba0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0bb0: 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 62  _NOTFOUND";    b
0bc0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0bd0: 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20  QLITE_FULL:     
0be0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0bf0: 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20  E_FULL";        
0c00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0c10: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a  SQLITE_CANTOPEN:
0c20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c30: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
0c40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0c50: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
0c60: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
0c70: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20  ITE_PROTOCOL";  
0c80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0c90: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
0ca0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0cb0: 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20  LITE_EMPTY";    
0cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0cd0: 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  se SQLITE_SCHEMA
0ce0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
0cf0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20  QLITE_SCHEMA";  
0d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0d10: 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  ase SQLITE_TOOBI
0d20: 47 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  G:     zName = "
0d30: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20  SQLITE_TOOBIG"; 
0d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0d50: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
0d60: 54 52 41 49 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20  TRAINT: zName = 
0d70: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
0d80: 4e 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  NT";  break;.   
0d90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
0da0: 4d 41 54 43 48 3a 20 20 20 7a 4e 61 6d 65 20 3d  MATCH:   zName =
0db0: 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43   "SQLITE_MISMATC
0dc0: 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  H";    break;.  
0dd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
0de0: 53 55 53 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20  SUSE:     zName 
0df0: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  = "SQLITE_MISUSE
0e00: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
0e10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
0e20: 4f 4c 46 53 3a 20 20 20 20 20 20 7a 4e 61 6d 65  OLFS:      zName
0e30: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   = "SQLITE_NOLFS
0e40: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0e50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0e60: 41 55 54 48 3a 20 20 20 20 20 20 20 7a 4e 61 6d  AUTH:       zNam
0e70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48  e = "SQLITE_AUTH
0e80: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
0e90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0ea0: 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 7a 4e 61  _FORMAT:     zNa
0eb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52  me = "SQLITE_FOR
0ec0: 4d 41 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  MAT";      break
0ed0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0ee0: 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 7a 4e  E_RANGE:      zN
0ef0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41  ame = "SQLITE_RA
0f00: 4e 47 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  NGE";       brea
0f10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0f20: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 7a  TE_ROW:        z
0f30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
0f40: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  OW";         bre
0f50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0f60: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
0f70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0f80: 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 62 72  DONE";        br
0f90: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
0fa0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
0fb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0fc0: 5f 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20 20 62  _Unknown";     b
0fd0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
0fe0: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
0ff0: 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e  ** Decode a poin
1000: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1010: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
1020: 69 63 20 69 6e 74 20 67 65 74 44 62 50 6f 69 6e  ic int getDbPoin
1030: 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ter(Tcl_Interp *
1040: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
1050: 61 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 20 2a  ar *zA, sqlite *
1060: 2a 70 70 44 62 29 7b 0a 20 20 69 66 28 20 73 73  *ppDb){.  if( ss
1070: 63 61 6e 66 28 7a 41 2c 20 50 54 52 5f 46 4d 54  canf(zA, PTR_FMT
1080: 2c 20 28 76 6f 69 64 2a 2a 29 70 70 44 62 29 21  , (void**)ppDb)!
1090: 3d 31 20 26 26 20 0a 20 20 20 20 20 20 28 7a 41  =1 && .      (zA
10a0: 5b 30 5d 21 3d 27 30 27 20 7c 7c 20 7a 41 5b 31  [0]!='0' || zA[1
10b0: 5d 21 3d 27 78 27 20 7c 7c 20 73 73 63 61 6e 66  ]!='x' || sscanf
10c0: 28 26 7a 41 5b 32 5d 2c 20 50 54 52 5f 46 4d 54  (&zA[2], PTR_FMT
10d0: 2c 20 28 76 6f 69 64 2a 2a 29 70 70 44 62 29 21  , (void**)ppDb)!
10e0: 3d 31 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c  =1).  ){.    Tcl
10f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1100: 74 65 72 70 2c 20 22 5c 22 22 2c 20 7a 41 2c 20  terp, "\"", zA, 
1110: 22 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  "\" is not a val
1120: 69 64 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  id pointer value
1130: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1140: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1150: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
1170: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
1180: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
1190: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
11a0: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
11b0: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
11c0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
11d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
11e0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
11f0: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 69   **ppStmt.){.  i
1200: 66 28 20 73 73 63 61 6e 66 28 7a 41 72 67 2c 20  f( sscanf(zArg, 
1210: 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64 2a 2a  PTR_FMT, (void**
1220: 29 70 70 53 74 6d 74 29 21 3d 31 20 29 7b 0a 20  )ppStmt)!=1 ){. 
1230: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1240: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 5c 22 22  ult(interp, "\""
1250: 2c 20 7a 41 72 67 2c 20 22 5c 22 20 69 73 20 6e  , zArg, "\" is n
1260: 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ot a valid point
1270: 65 72 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  er value", 0);. 
1280: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1290: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
12a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
12b0: 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e  ** Decode a poin
12c0: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
12d0: 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a  3_stmt object..*
12e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
12f0: 46 69 6c 65 50 6f 69 6e 74 65 72 28 0a 20 20 54  FilePointer(.  T
1300: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1310: 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
1320: 20 2a 7a 41 72 67 2c 20 20 0a 20 20 4f 73 46 69   *zArg,  .  OsFi
1330: 6c 65 20 2a 2a 70 70 46 69 6c 65 0a 29 7b 0a 20  le **ppFile.){. 
1340: 20 69 66 28 20 73 73 63 61 6e 66 28 7a 41 72 67   if( sscanf(zArg
1350: 2c 20 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64  , PTR_FMT, (void
1360: 2a 2a 29 70 70 46 69 6c 65 29 21 3d 31 20 29 7b  **)ppFile)!=1 ){
1370: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1380: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 5c  esult(interp, "\
1390: 22 22 2c 20 7a 41 72 67 2c 20 22 5c 22 20 69 73  "", zArg, "\" is
13a0: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 69   not a valid poi
13b0: 6e 74 65 72 20 76 61 6c 75 65 22 2c 20 30 29 3b  nter value", 0);
13c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
13e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
13f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1400: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
1410: 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ion of a pointer
1420: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64   that can be und
1430: 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68  erstood.** by th
1440: 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61  e getDbPointer a
1450: 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20  nd getVmPointer 
1460: 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a  routines above..
1470: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65  **.** The proble
1480: 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61  m is, on some ma
1490: 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29  chines (Solaris)
14a0: 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69   if you do a pri
14b0: 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22  ntf with.** "%p"
14c0: 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e   you cannot turn
14d0: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61   around and do a
14e0: 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20   scanf with the 
14f0: 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a  same "%p" and.**
1500: 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65   get your pointe
1510: 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76  r back.  You hav
1520: 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22  e to prepend a "
1530: 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69  0x" before it wi
1540: 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20  ll.** work.  Or 
1550: 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73  at least that is
1560: 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65   what is reporte
1570: 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20  d to me (drh).  
1580: 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61  But this.** beha
1590: 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d  vior varies from
15a0: 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68   machine to mach
15b0: 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69  ine.  The soluti
15c0: 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a  on used her is.*
15d0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74  * to test the st
15e0: 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72  ring right after
15f0: 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64   it is generated
1600: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
1610: 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f  n be.** understo
1620: 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64  od by scanf, and
1630: 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65   if not, try pre
1640: 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20  pending an "0x" 
1650: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61  to see if.** tha
1660: 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74  t helps.  If not
1670: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61  hing works, a fa
1680: 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  tal error is gen
1690: 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erated..*/.stati
16a0: 63 20 69 6e 74 20 6d 61 6b 65 50 6f 69 6e 74 65  c int makePointe
16b0: 72 53 74 72 28 54 63 6c 5f 49 6e 74 65 72 70 20  rStr(Tcl_Interp 
16c0: 2a 69 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 7a  *interp, char *z
16d0: 50 74 72 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20  Ptr, void *p){. 
16e0: 20 76 6f 69 64 20 2a 70 32 3b 0a 20 20 73 70 72   void *p2;.  spr
16f0: 69 6e 74 66 28 7a 50 74 72 2c 20 50 54 52 5f 46  intf(zPtr, PTR_F
1700: 4d 54 2c 20 70 29 3b 0a 20 20 69 66 28 20 73 73  MT, p);.  if( ss
1710: 63 61 6e 66 28 7a 50 74 72 2c 20 50 54 52 5f 46  canf(zPtr, PTR_F
1720: 4d 54 2c 20 26 70 32 29 21 3d 31 20 7c 7c 20 70  MT, &p2)!=1 || p
1730: 32 21 3d 70 20 29 7b 0a 20 20 20 20 73 70 72 69  2!=p ){.    spri
1740: 6e 74 66 28 7a 50 74 72 2c 20 22 30 78 22 20 50  ntf(zPtr, "0x" P
1750: 54 52 5f 46 4d 54 2c 20 70 29 3b 0a 20 20 20 20  TR_FMT, p);.    
1760: 69 66 28 20 73 73 63 61 6e 66 28 7a 50 74 72 2c  if( sscanf(zPtr,
1770: 20 50 54 52 5f 46 4d 54 2c 20 26 70 32 29 21 3d   PTR_FMT, &p2)!=
1780: 31 20 7c 7c 20 70 32 21 3d 70 20 29 7b 0a 20 20  1 || p2!=p ){.  
1790: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
17b0: 61 62 6c 65 20 74 6f 20 63 6f 6e 76 65 72 74 20  able to convert 
17c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
17d0: 74 72 69 6e 67 20 22 0a 20 20 20 20 20 20 20 20  tring ".        
17e0: 20 22 69 6e 20 74 68 65 20 66 69 6c 65 20 22 20   "in the file " 
17f0: 5f 5f 46 49 4c 45 5f 5f 20 22 20 69 6e 20 66 75  __FILE__ " in fu
1800: 6e 63 74 69 6f 6e 20 6d 61 6b 65 50 6f 69 6e 74  nction makePoint
1810: 65 72 53 74 72 28 29 2e 20 20 50 6c 65 61 73 65  erStr().  Please
1820: 20 22 0a 20 20 20 20 20 20 20 20 20 22 72 65 70   ".         "rep
1830: 6f 72 74 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ort this problem
1840: 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 6d   to the SQLite m
1850: 61 69 6c 69 6e 67 20 6c 69 73 74 20 6f 72 20 61  ailing list or a
1860: 73 20 61 20 6e 65 77 20 62 75 74 20 22 0a 20 20  s a new but ".  
1870: 20 20 20 20 20 20 20 22 72 65 70 6f 72 74 2e 20         "report. 
1880: 20 50 6c 65 61 73 65 20 70 72 6f 76 69 64 65 20   Please provide 
1890: 64 65 74 61 69 6c 65 64 20 69 6e 66 6f 72 6d 61  detailed informa
18a0: 74 69 6f 6e 20 61 62 6f 75 74 20 68 6f 77 20 79  tion about how y
18b0: 6f 75 20 63 6f 6d 70 69 6c 65 64 20 22 0a 20 20  ou compiled ".  
18c0: 20 20 20 20 20 20 20 22 53 51 4c 69 74 65 20 61         "SQLite a
18d0: 6e 64 20 77 68 61 74 20 63 6f 6d 70 75 74 65 72  nd what computer
18e0: 20 79 6f 75 20 61 72 65 20 72 75 6e 6e 69 6e 67   you are running
18f0: 20 6f 6e 2e 22 2c 20 30 29 3b 0a 20 20 20 20 20   on.", 0);.     
1900: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1910: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  R;.    }.  }.  r
1920: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1930: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  ./*.** The callb
1940: 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ack routine for 
1950: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
1960: 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntf()..*/.static
1970: 20 69 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66   int exec_printf
1980: 5f 63 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  _cb(void *pArg, 
1990: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
19a0: 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61  *argv, char **na
19b0: 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69  me){.  Tcl_DStri
19c0: 6e 67 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44  ng *str = (Tcl_D
19d0: 53 74 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20  String*)pArg;.  
19e0: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63  int i;..  if( Tc
19f0: 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28  l_DStringLength(
1a00: 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  str)==0 ){.    f
1a10: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
1a20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
1a30: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1a40: 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69  ment(str, name[i
1a50: 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e  ] ? name[i] : "N
1a60: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
1a70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1a80: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  gc; i++){.    Tc
1a90: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
1aa0: 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76  lement(str, argv
1ab0: 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20  [i] ? argv[i] : 
1ac0: 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72  "NULL");.  }.  r
1ad0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1ae0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1af0: 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44  3_exec_printf  D
1b00: 42 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e  B  FORMAT  STRIN
1b10: 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  G.**.** Invoke t
1b20: 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  he sqlite3_exec_
1b30: 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61  printf() interfa
1b40: 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65  ce using the ope
1b50: 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42  n database.** DB
1b60: 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68  .  The SQL is th
1b70: 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e  e string FORMAT.
1b80: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72    The format str
1b90: 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ing should conta
1ba0: 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20  in.** one %s or 
1bb0: 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74  %q.  STRING is t
1bc0: 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65  he value inserte
1bd0: 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e  d into %s or %q.
1be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1bf0: 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  est_exec_printf(
1c00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
1c10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1c30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1c40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1c50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1c60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
1c70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1c90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
1ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1cb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
1cc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
1cd0: 74 65 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  te *db;.  Tcl_DS
1ce0: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
1cf0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1d00: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  r = 0;.  char zB
1d10: 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72  uf[30];.  if( ar
1d20: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
1d30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d40: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d50: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d60: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1d70: 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54       " DB FORMAT
1d80: 20 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20   STRING", 0);.  
1d90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1da0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1db0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1dc0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1dd0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1de0: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
1df0: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
1e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1e10: 63 5f 70 72 69 6e 74 66 28 64 62 2c 20 61 72 67  c_printf(db, arg
1e20: 76 5b 32 5d 2c 20 65 78 65 63 5f 70 72 69 6e 74  v[2], exec_print
1e30: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
1e40: 72 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 73  r, argv[3]);.  s
1e50: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
1e60: 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70  ", rc);.  Tcl_Ap
1e70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1e80: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  rp, zBuf);.  Tcl
1e90: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
1ea0: 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54  nterp, rc==SQLIT
1eb0: 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69  E_OK ? Tcl_DStri
1ec0: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20  ngValue(&str) : 
1ed0: 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zErr);.  Tcl_DSt
1ee0: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
1ef0: 20 20 69 66 28 20 7a 45 72 72 20 29 20 66 72 65    if( zErr ) fre
1f00: 65 28 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72  e(zErr);.  retur
1f10: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f20: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1f30: 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
1f40: 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52  t  SEPARATOR  AR
1f50: 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a  G0  ARG1 ....**.
1f60: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66  ** Test the %z f
1f70: 6f 72 6d 61 74 20 6f 66 20 6d 70 72 69 6e 74 66  ormat of mprintf
1f80: 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70 6c  ().  Use multipl
1f90: 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c 6c  e mprintf() call
1fa0: 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74 65  s to .** concate
1fb0: 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f 75 67  nate arg0 throug
1fc0: 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65 70  h argn using sep
1fd0: 61 72 61 74 6f 72 20 61 73 20 74 68 65 20 73 65  arator as the se
1fe0: 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74 75  parator..** Retu
1ff0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
2000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
2010: 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20 76  t_mprintf_z(.  v
2020: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2030: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2040: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2050: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2060: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2070: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2080: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2090: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20a0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20b0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
20c0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
20d0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
20e0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  */.){.  char *zR
20f0: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e 74  esult = 0;.  int
2100: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20   i;..  for(i=2; 
2110: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
2120: 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    zResult = sqli
2130: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 25 73  te3MPrintf("%z%s
2140: 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72  %s", zResult, ar
2150: 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b  gv[1], argv[i]);
2160: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
2170: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2180: 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73  zResult, 0);.  s
2190: 71 6c 69 74 65 46 72 65 65 28 7a 52 65 73 75 6c  qliteFree(zResul
21a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
21b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
21c0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 67 65  age:  sqlite3_ge
21d0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 20  t_table_printf  
21e0: 44 42 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49  DB  FORMAT  STRI
21f0: 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  NG.**.** Invoke 
2200: 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  the sqlite3_get_
2210: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29 20 69  table_printf() i
2220: 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74  nterface using t
2230: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
2240: 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c  .** DB.  The SQL
2250: 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 20 46   is the string F
2260: 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d  ORMAT.  The form
2270: 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64  at string should
2280: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20   contain.** one 
2290: 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e  %s or %q.  STRIN
22a0: 47 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  G is the value i
22b0: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20  nserted into %s 
22c0: 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63  or %q..*/.static
22d0: 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f 74 61   int test_get_ta
22e0: 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  ble_printf(.  vo
22f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2300: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2310: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2320: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2330: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2340: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2350: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2370: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2380: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2390: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
23a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
23b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  /.){.  sqlite *d
23c0: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
23d0: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
23e0: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
23f0: 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 43  ;.  int nRow, nC
2400: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65  ol;.  char **aRe
2410: 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sult;.  int i;. 
2420: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
2430: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
2440: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2460: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2470: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2480: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
2490: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
24a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24c0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24d0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
24e0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
24f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
2500: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2510: 73 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  str);.  rc = sql
2520: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70  ite3_get_table_p
2530: 72 69 6e 74 66 28 64 62 2c 20 61 72 67 76 5b 32  rintf(db, argv[2
2540: 5d 2c 20 26 61 52 65 73 75 6c 74 2c 20 26 6e 52  ], &aResult, &nR
2550: 6f 77 2c 20 26 6e 43 6f 6c 2c 20 0a 20 20 20 20  ow, &nCol, .    
2560: 20 20 20 20 20 20 20 20 20 20 20 26 7a 45 72 72             &zErr
2570: 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 73 70  , argv[3]);.  sp
2580: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
2590: 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , rc);.  Tcl_App
25a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
25b0: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  p, zBuf);.  if( 
25c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25d0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
25e0: 66 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a  f, "%d", nRow);.
25f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c      Tcl_AppendEl
2600: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
2610: 75 66 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  uf);.    sprintf
2620: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 43 6f  (zBuf, "%d", nCo
2630: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  l);.    Tcl_Appe
2640: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2650: 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 66 6f 72  , zBuf);.    for
2660: 28 69 3d 30 3b 20 69 3c 28 6e 52 6f 77 2b 31 29  (i=0; i<(nRow+1)
2670: 2a 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  *nCol; i++){.   
2680: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
2690: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 61 52 65  ment(interp, aRe
26a0: 73 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73 75 6c  sult[i] ? aResul
26b0: 74 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  t[i] : "NULL");.
26c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
26d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
26e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  ment(interp, zEr
26f0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
2700: 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 52 65  3_free_table(aRe
2710: 73 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a 45 72  sult);.  if( zEr
2720: 72 20 29 20 66 72 65 65 28 7a 45 72 72 29 3b 0a  r ) free(zErr);.
2730: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2740: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
2750: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
2760: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
2770: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
2780: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
2790: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
27a0: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
27b0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61  atic int test_la
27c0: 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64  st_rowid(.  void
27d0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
27e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
27f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2800: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2810: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2820: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2830: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2840: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2850: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2860: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
2870: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2880: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2890: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
28a0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
28b0: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
28c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
28d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
28e0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
28f0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2900: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
2910: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2930: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2940: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2950: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2960: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
2970: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c  rintf(zBuf, "%ll
2980: 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d", sqlite3_last
2990: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
29a0: 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
29b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
29c0: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
29d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29e0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
29f0: 6c 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a  lite3_close DB.*
2a00: 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20  *.** Closes the 
2a10: 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
2a20: 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e  by sqlite3_open.
2a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2a40: 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65  qlite_test_close
2a50: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2a60: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2a70: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2a80: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2a90: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2aa0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2ab0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ad0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2ae0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b00: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2b10: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2b20: 69 74 65 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  ite *db;.  int r
2b30: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
2b40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2b50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2b60: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2b70: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2b80: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
2b90: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
2ba0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2bb0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2bc0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2bd0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
2be0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2bf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
2c00: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
2c10: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
2c20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2c30: 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29   *)errorName(rc)
2c40: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
2c50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2c70: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
2c80: 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e 63  _coalesce() func
2c90: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
2ca0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
2cb0: 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  nt non-NULL argu
2cc0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
2cd0: 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28  void ifnullFunc(
2ce0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2cf0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
2d00: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
2d10: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  e **argv){.  int
2d20: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2d30: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
2d40: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
2d50: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
2d60: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b  type(argv[i]) ){
2d70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2d80: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
2d90: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
2da0: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c  e_text(argv[i]),
2db0: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 53   -1,.          S
2dc0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
2dd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2de0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2df0: 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e  * A structure in
2e00: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75  to which to accu
2e10: 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a  mulate text..*/.
2e20: 73 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20  struct dstr {.  
2e30: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20  int nAlloc;  /* 
2e40: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
2e50: 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20  */.  int nUsed; 
2e60: 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20    /* Space used 
2e70: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
2e80: 20 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a    /* The space *
2e90: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  /.};../*.** Appe
2ea0: 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74  nd text to a dst
2eb0: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r.*/.static void
2ec0: 20 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75   dstrAppend(stru
2ed0: 63 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73  ct dstr *p, cons
2ee0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64  t char *z, int d
2ef0: 69 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e  ivider){.  int n
2f00: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
2f10: 69 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e  if( p->nUsed + n
2f20: 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63   + 2 > p->nAlloc
2f30: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e   ){.    char *zN
2f40: 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f  ew;.    p->nAllo
2f50: 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  c = p->nAlloc*2 
2f60: 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a  + n + 200;.    z
2f70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
2f80: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
2f90: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  loc);.    if( zN
2fa0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
2fb0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b  qliteFree(p->z);
2fc0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  .      memset(p,
2fd0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
2fe0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
2ff0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d 20     }.    p->z = 
3000: 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zNew;.  }.  if( 
3010: 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e 55  divider && p->nU
3020: 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  sed>0 ){.    p->
3030: 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  z[p->nUsed++] = 
3040: 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20 6d  divider;.  }.  m
3050: 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e  emcpy(&p->z[p->n
3060: 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a  Used], z, n+1);.
3070: 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b    p->nUsed += n;
3080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
3090: 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 62  d for each callb
30a0: 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ack from sqlite3
30b0: 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61 74  ExecFunc.*/.stat
30c0: 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63 43  ic int execFuncC
30d0: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44  allback(void *pD
30e0: 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  ata, int argc, c
30f0: 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72  har **argv, char
3100: 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73   **NotUsed){.  s
3110: 74 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d 20  truct dstr *p = 
3120: 28 73 74 72 75 63 74 20 64 73 74 72 2a 29 70 44  (struct dstr*)pD
3130: 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ata;.  int i;.  
3140: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
3150: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
3160: 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  rgv[i]==0 ){.   
3170: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
3180: 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a 20   "NULL", ' ');. 
3190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31a0: 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61 72  dstrAppend(p, ar
31b0: 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20 20  gv[i], ' ');.   
31c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
31d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  0;.}../*.** Impl
31e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
31f0: 65 20 78 5f 73 71 6c 69 74 65 33 5f 65 78 65 63  e x_sqlite3_exec
3200: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
3210: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  is function take
3220: 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72  s.** a single ar
3230: 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d  gument and attem
3240: 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20 74  pts to execute t
3250: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20  hat argument as 
3260: 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69  SQL code..** Thi
3270: 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64  s is illegal and
3280: 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20   should set the 
3290: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c  SQLITE_MISUSE fl
32a0: 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ag on the databa
32b0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  se..**.** 2004-J
32c0: 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20  an-07:  We have 
32d0: 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20  changed this to 
32e0: 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f  make it legal to
32f0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78   call sqlite3_ex
3300: 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74  ec().** from wit
3310: 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  hin a function c
3320: 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68  all.  .** .** Th
3330: 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c  is routine simul
3340: 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74 20  ates the effect 
3350: 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68  of having two th
3360: 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f  reads attempt to
3370: 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65  .** use the same
3380: 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
3390: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73   same time..*/.s
33a0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
33b0: 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71  e3ExecFunc(.  sq
33c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
33d0: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
33e0: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
33f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
3400: 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20 78  .  struct dstr x
3410: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30  ;.  memset(&x, 0
3420: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
3430: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73 71  sqlite3_exec((sq
3440: 6c 69 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73  lite*)sqlite3_us
3450: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
3460: 2c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ,.      sqlite3_
3470: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
3480: 30 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46  0]),.      execF
3490: 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c  uncCallback, &x,
34a0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72   0);.  sqlite3_r
34b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
34c0: 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64  xt, x.z, x.nUsed
34d0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
34e0: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  NT);.  sqliteFre
34f0: 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(x.z);.}../*.**
3500: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
3510: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
3520: 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  tion DB.**.** Ca
3530: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
3540: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
3550: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
3560: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
3570: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
3580: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
3590: 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54  "x_coalesce".  T
35a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
35b0: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
35c0: 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c  .** as the "coal
35d0: 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20  esce" function. 
35e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
35f0: 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e  lso registers an
3600: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
3610: 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65   named "x_sqlite
3620: 33 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e 76  3_exec" that inv
3630: 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65  okes sqlite3_exe
3640: 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73  c().  Invoking s
3650: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a  qlite3_exec().**
3660: 20 69 6e 20 74 68 69 73 20 77 61 79 20 69 73 20   in this way is 
3670: 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f  illegal recursio
3680: 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69  n and should rai
3690: 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53  se an SQLITE_MIS
36a0: 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68  USE error..** Th
36b0: 65 20 65 66 66 65 63 74 20 69 73 20 73 69 6d 69  e effect is simi
36c0: 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f  lar to trying to
36d0: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61   use the same da
36e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
36f0: 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68  n from.** two th
3700: 72 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d  reads at the sam
3710: 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e time..**.** Th
3720: 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76  e original motiv
3730: 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72  ation for this r
3740: 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65  outine was to be
3750: 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   able to call th
3760: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65  e.** sqlite3_cre
3770: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e  ate_function fun
3780: 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75  ction while a qu
3790: 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65  ery is in progre
37a0: 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74  ss in order.** t
37b0: 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54  o test the SQLIT
37c0: 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69  E_MISUSE detecti
37d0: 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61  on logic..*/.sta
37e0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
37f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
3800: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3810: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3820: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3830: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3840: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3850: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3860: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3870: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3880: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3890: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
38a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
38b0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
38c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20   */.){.  sqlite 
38d0: 2a 64 62 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f  *db;.  extern vo
38e0: 69 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28  id Md5_Register(
38f0: 73 71 6c 69 74 65 2a 29 3b 0a 20 20 69 66 28 20  sqlite*);.  if( 
3900: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
3910: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3920: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3930: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
3940: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
3950: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
3960: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
3970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3980: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
3990: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
39a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
39b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
39c0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
39d0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
39e0: 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20  _coalesce", -1, 
39f0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
3a00: 0a 20 20 20 20 20 20 69 66 6e 75 6c 6c 46 75 6e  .      ifnullFun
3a10: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  c, 0, 0);.  sqli
3a20: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
3a30: 69 6f 6e 28 64 62 2c 20 22 78 5f 73 71 6c 69 74  ion(db, "x_sqlit
3a40: 65 33 5f 65 78 65 63 22 2c 20 31 2c 20 53 51 4c  e3_exec", 1, SQL
3a50: 49 54 45 5f 55 54 46 38 2c 20 64 62 2c 0a 20 20  ITE_UTF8, db,.  
3a60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 65 63 46      sqlite3ExecF
3a70: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  unc, 0, 0);.  re
3a80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3a90: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
3aa0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
3ab0: 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  x_count() aggreg
3ac0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ate function..*/
3ad0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3ae0: 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74 43 74  CountCtx CountCt
3af0: 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e 74 43  x;.struct CountC
3b00: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b  tx {.  int n;.};
3b10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
3b20: 6e 74 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63  ntStep(sqlite3_c
3b30: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3b40: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
3b50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
3b60: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
3b70: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
3b80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
3b90: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
3ba0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72  (*p));.  if( (ar
3bb0: 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  gc==0 || SQLITE_
3bc0: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
3bd0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
3be0: 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20  ) ) && p ){.    
3bf0: 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20 20 20  p->n++;.  }.}   
3c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
3c10: 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  ntFinalize(sqlit
3c20: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3c30: 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  ext){.  CountCtx
3c40: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
3c50: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3c60: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
3c70: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73 71 6c  zeof(*p));.  sql
3c80: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
3c90: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
3ca0: 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n : 0);.}../*.**
3cb0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
3cc0: 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
3cd0: 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43  egate DB.**.** C
3ce0: 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f  all the sqlite3_
3cf0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
3d00: 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  API on the given
3d10: 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64   database in ord
3d20: 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  er.** to create 
3d30: 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  a function named
3d40: 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69   "x_count".  Thi
3d50: 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
3d60: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a  the same thing.*
3d70: 2a 20 61 73 20 74 68 65 20 22 6d 64 35 73 75 6d  * as the "md5sum
3d80: 22 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  " function..**.*
3d90: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d  * The original m
3da0: 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68  otivation for th
3db0: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74  is routine was t
3dc0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c  o be able to cal
3dd0: 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  l the.** sqlite3
3de0: 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
3df0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  e function while
3e00: 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70   a query is in p
3e10: 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72  rogress in order
3e20: 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20  .** to test the 
3e30: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65  SQLITE_MISUSE de
3e40: 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a  tection logic..*
3e50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
3e60: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
3e70: 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  te(.  void *NotU
3e80: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3e90: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3ea0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3eb0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3ec0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3ed0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3ef0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3f00: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3f10: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3f20: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3f30: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
3f40: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 69 66 28  qlite *db;.  if(
3f50: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
3f60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3f70: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3f80: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3f90: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
3fa0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
3fb0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
3fc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3fd0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
3fe0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
3ff0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
4000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4010: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
4020: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
4030: 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  x_count", 0, SQL
4040: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
4050: 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65 70 2c        countStep,
4060: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a  countFinalize);.
4070: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
4080: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
4090: 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49  _count", 1, SQLI
40a0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20  TE_UTF8, 0, 0,. 
40b0: 20 20 20 20 20 63 6f 75 6e 74 53 74 65 70 2c 63       countStep,c
40c0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20  ountFinalize);. 
40d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
40e0: 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  }..../*.** Usage
40f0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
4100: 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20 49 4e  tf_int FORMAT IN
4110: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e  TEGER INTEGER IN
4120: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TEGER.**.** Call
4130: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68   mprintf with th
4140: 72 65 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  ree integer argu
4150: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
4160: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
4170: 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20  ntf_int(.  void 
4180: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4190: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
41a0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
41b0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
41c0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
41d0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
41e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
41f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4200: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
4210: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
4220: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4230: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4240: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
4250: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
4260: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
4270: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4280: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
4290: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
42a0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
42b0: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
42c0: 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c   INT INT INT\"",
42d0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
42e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
42f0: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69   for(i=2; i<5; i
4300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
4310: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
4320: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
4330: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4340: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
4350: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
4360: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
4370: 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63  [1], a[2]);.  Tc
4380: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4390: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
43a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
43b0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
43c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
43d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
43e0: 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41 54 20  tf_int64 FORMAT 
43f0: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
4400: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61  INTEGER.**.** Ca
4410: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
4420: 74 68 72 65 65 20 36 34 2d 62 69 74 20 69 6e 74  three 64-bit int
4430: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a  eger arguments.*
4440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
4450: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
4460: 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  64(.  void *NotU
4470: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4480: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4490: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
44a0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
44b0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
44c0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
44d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
44e0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
44f0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4500: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4510: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4520: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
4530: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69  nt i;.  sqlite_i
4540: 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61  nt64 a[3];.  cha
4550: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
4560: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
4570: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4580: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4590: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
45a0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
45b0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
45c0: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
45d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
45e0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
45f0: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
4600: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 47     if( !sqlite3G
4610: 65 74 49 6e 74 36 34 28 61 72 67 76 5b 69 5d 2c  etInt64(argv[i],
4620: 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a 20 20 20   &a[i-2]) ){.   
4630: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4640: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67  ult(interp, "arg
4650: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76  ument is not a v
4660: 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65  alid 64-bit inte
4670: 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ger", 0);.      
4680: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4690: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20  ;.    }.  }.  z 
46a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
46b0: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
46c0: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
46d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
46e0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
46f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4700: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
4710: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4720: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
4730: 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20  intf_str FORMAT 
4740: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
4750: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c  STRING.**.** Cal
4760: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
4770: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
4780: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72  ents and one str
4790: 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ing argument.*/.
47a0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
47b0: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a  e3_mprintf_str(.
47c0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
47d0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
47e0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
47f0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
4800: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
4810: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
4820: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
4830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4840: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
4850: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
4860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
4870: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
4880: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
4890: 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a  [3], i;.  char *
48a0: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20  z;.  if( argc<4 
48b0: 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20  || argc>5 ){.   
48c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
48d0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
48e0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
48f0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
4900: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
4910: 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47   INT INT ?STRING
4920: 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ?\"", 0);.    re
4930: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4940: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
4950: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
4960: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
4970: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
4980: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
4990: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
49a0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
49b0: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b  intf(argv[1], a[
49c0: 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34  0], a[1], argc>4
49d0: 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c   ? argv[4] : NUL
49e0: 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  L);.  Tcl_Append
49f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
4a00: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
4a10: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
4a20: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4a30: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4a40: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 46  e3_mprintf_str F
4a50: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
4a60: 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a  TEGER DOUBLE.**.
4a70: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
4a80: 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72  with two integer
4a90: 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f   arguments and o
4aa0: 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  ne double argume
4ab0: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  nt.*/.static int
4ac0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
4ad0: 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
4ae0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4af0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4b00: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4b10: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4b20: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4b30: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4b40: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4b60: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
4b70: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
4b80: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4b90: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4ba0: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
4bb0: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63  .  double r;.  c
4bc0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
4bd0: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
4be0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4bf0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4c00: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4c10: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4c20: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
4c30: 20 49 4e 54 20 53 54 52 49 4e 47 5c 22 22 2c 20   INT STRING\"", 
4c40: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
4c50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
4c60: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
4c70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
4c80: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
4c90: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
4ca0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4cb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
4cc0: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74  cl_GetDouble(int
4cd0: 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72  erp, argv[4], &r
4ce0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4cf0: 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  RROR;.  z = sqli
4d00: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4d10: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
4d20: 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e   r);.  Tcl_Appen
4d30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4d40: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
4d50: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
4d60: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
4d70: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
4d80: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
4d90: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
4da0: 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  UBLE.**.** Call 
4db0: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73  mprintf with a s
4dc0: 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67  ingle double arg
4dd0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74  ument which is t
4de0: 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68  he product of th
4df0: 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e  e.** two argumen
4e00: 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20  ts given above. 
4e10: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
4e20: 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c   generate overfl
4e30: 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77  ow and underflow
4e40: 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74  .** doubles to t
4e50: 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72  est that they ar
4e60: 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70  e converted prop
4e70: 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erly..*/.static 
4e80: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
4e90: 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f  ntf_scaled(.  vo
4ea0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4eb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4ec0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4ed0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4ee0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4ef0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
4f00: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4f10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4f20: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
4f30: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4f40: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
4f50: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
4f60: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
4f70: 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63  double r[2];.  c
4f80: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
4f90: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
4fa0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4fb0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4fc0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4fd0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4fe0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55      " FORMAT DOU
4ff0: 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30  BLE DOUBLE\"", 0
5000: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5010: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
5020: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
5030: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
5040: 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  etDouble(interp,
5050: 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32   argv[i], &r[i-2
5060: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
5070: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d  ERROR;.  }.  z =
5080: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5090: 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72  (argv[1], r[0]*r
50a0: 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [1]);.  Tcl_Appe
50b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
50c0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
50d0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
50e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
50f0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
5100: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20 4e  te_malloc_fail N
5110: 0a 2a 2a 0a 2a 2a 20 52 69 67 20 73 71 6c 69 74  .**.** Rig sqlit
5120: 65 4d 61 6c 6c 6f 63 28 29 20 74 6f 20 66 61 69  eMalloc() to fai
5130: 6c 20 6f 6e 20 74 68 65 20 4e 2d 74 68 20 63 61  l on the N-th ca
5140: 6c 6c 2e 20 20 54 75 72 6e 20 6f 66 66 20 74 68  ll.  Turn off th
5150: 69 73 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  is mechanism.** 
5160: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 73 71  and reset the sq
5170: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
5180: 6c 65 64 20 76 61 72 69 61 62 6c 65 20 69 73 20  led variable is 
5190: 4e 3d 3d 30 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  N==0..*/.#ifdef 
51a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
51b0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 6d  tic int sqlite_m
51c0: 61 6c 6c 6f 63 5f 66 61 69 6c 28 0a 20 20 76 6f  alloc_fail(.  vo
51d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
51e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
51f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
5200: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
5210: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
5220: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
5230: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
5240: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5250: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
5260: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
5270: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
5280: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
5290: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
52a0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
52b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
52c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
52d0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
52e0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
52f0: 5d 2c 20 22 20 4e 5c 22 22 2c 20 30 29 3b 0a 20  ], " N\"", 0);. 
5300: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5310: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
5320: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
5330: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29  , argv[1], &n) )
5340: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5350: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 4d 61  R;.  sqlite3_iMa
5360: 6c 6c 6f 63 46 61 69 6c 20 3d 20 6e 3b 0a 20 20  llocFail = n;.  
5370: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
5380: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 72 65 74  ailed = 0;.  ret
5390: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
53a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ndif../*.** Usag
53b0: 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  e: sqlite_malloc
53c0: 5f 73 74 61 74 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _stat.**.** Retu
53d0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
53e0: 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20   prior calls to 
53f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5400: 6e 64 20 73 71 6c 69 74 65 46 72 65 65 28 29 2e  nd sqliteFree().
5410: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5420: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5430: 6e 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  nt sqlite_malloc
5440: 5f 73 74 61 74 28 0a 20 20 76 6f 69 64 20 2a 4e  _stat(.  void *N
5450: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
5460: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
5470: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
5480: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
5490: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
54a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
54c0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
54d0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
54e0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
54f0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
5500: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
5510: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
5520: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
5530: 2c 20 22 25 64 20 25 64 20 25 64 22 2c 20 73 71  , "%d %d %d", sq
5540: 6c 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2c 20 73  lite3_nMalloc, s
5550: 71 6c 69 74 65 33 5f 6e 46 72 65 65 2c 20 73 71  qlite3_nFree, sq
5560: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
5570: 6c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  l);.  Tcl_Append
5580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
5590: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
55a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
55b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
55c0: 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a    sqlite_abort.*
55d0: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
55e0: 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69  e process immedi
55f0: 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20  ately.  This is 
5600: 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74  not a clean shut
5610: 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  down..** This co
5620: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
5630: 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76 65   test the recove
5640: 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61  rability of a da
5650: 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65  tabase in.** the
5660: 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67   event of a prog
5670: 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74  ram crash..*/.st
5680: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
5690: 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e  abort(.  void *N
56a0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
56b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
56c0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
56d0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
56e0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
56f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5710: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
5720: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
5730: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
5740: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
5750: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
5760: 20 20 61 73 73 65 72 74 28 20 69 6e 74 65 72 70    assert( interp
5770: 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73  ==0 );   /* This
5780: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
5790: 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  l */.  return TC
57a0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
57b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
57c0: 74 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64  tine is a user-d
57d0: 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74  efined SQL funct
57e0: 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73  ion whose purpos
57f0: 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20  e.** is to test 
5800: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72  the sqlite_set_r
5810: 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a  esult() API..*/.
5820: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
5830: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
5840: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
5850: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
5860: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
5870: 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32    while( argc>=2
5880: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
5890: 61 72 20 2a 7a 41 72 67 30 20 3d 20 73 71 6c 69  ar *zArg0 = sqli
58a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
58b0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
58c0: 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20   zArg0 ){.      
58d0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
58e0: 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e  rICmp(zArg0, "in
58f0: 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t") ){.        s
5900: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
5910: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
5920: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
5930: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
5940: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
5950: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e  trICmp(zArg0,"in
5960: 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t64")==0 ){.    
5970: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5980: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
5990: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
59a0: 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b  int64(argv[1]));
59b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
59c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
59d0: 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d  zArg0,"string")=
59e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
59f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
5a00: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
5a10: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5a20: 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20  gv[1]), -1,.    
5a30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
5a40: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
5a50: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
5a60: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
5a70: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
5a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5a90: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
5aa0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
5ab0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
5ac0: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
5ad0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
5ae0: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c  rICmp(zArg0,"nul
5af0: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
5b00: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5b10: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
5b20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5b30: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5b40: 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30  Arg0,"value")==0
5b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5b60: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
5b70: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73  (context, argv[s
5b80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
5b90: 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20  (argv[1])]);.   
5ba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5bb0: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
5bc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5bd0: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
5be0: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
5bf0: 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a  .    argc -= 2;.
5c00: 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
5c10: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72   }.  return;..er
5c20: 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
5c30: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
5c40: 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61  context,"first a
5c50: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
5c60: 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20  e one of: ".    
5c70: 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72    "int int64 str
5c80: 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20  ing double null 
5c90: 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a  value", -1);.}..
5ca0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
5cb0: 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
5cc0: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42  est_function  DB
5cd0: 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67    NAME.**.** Reg
5ce0: 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53  ister the test S
5cf0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  QL function on t
5d00: 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75  he database DB u
5d10: 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41  nder the name NA
5d20: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
5d30: 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  t test_register_
5d40: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  func(.  void *No
5d50: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
5d60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
5d70: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
5d80: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
5d90: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5da0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5dc0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
5dd0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
5de0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
5df0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
5e00: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
5e10: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 69   sqlite *db;.  i
5e20: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67  nt rc;.  if( arg
5e30: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
5e40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
5e50: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
5e60: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
5e70: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
5e80: 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f      " DB FUNCTIO
5e90: 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20  N-NAME", 0);.   
5ea0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5eb0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
5ec0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
5ed0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
5ee0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
5ef0: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
5f00: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
5f10: 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
5f20: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
5f30: 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46   0, .      testF
5f40: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
5f50: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54  ( rc!=0 ){.    T
5f60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5f70: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
5f80: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
5f90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5fa0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
5fb0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
5fc0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
5fd0: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d  e3_finalize  STM
5fe0: 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a  T .**.** Finaliz
5ff0: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  e a statement ha
6000: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
6010: 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a  int test_finaliz
6020: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
6030: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
6040: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
6050: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
6060: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
6070: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
6080: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
6090: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
60a0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
60b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
60c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
60d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
60e0: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
60f0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6100: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
6110: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
6120: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6130: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
6140: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
6150: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
6160: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
6170: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
6180: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
6190: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
61a0: 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
61b0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
61c0: 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61   (char *)errorNa
61d0: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
61e0: 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
61f0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
6200: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
6210: 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a  eset  STMT .**.*
6220: 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61  * Finalize a sta
6230: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a  tement handle..*
6240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
6250: 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20  t_reset(.  void 
6260: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
6270: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6280: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
6290: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
62a0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
62b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
62c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
62d0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
62e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
62f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
6300: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
6310: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
6320: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6330: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
6340: 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
6350: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
6360: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
6370: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
6380: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
6390: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
63a0: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
63b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
63c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
63d0: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
63e0: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
63f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6400: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
6410: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
6420: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  e:  sqlite3_chan
6430: 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ges DB.**.** Ret
6440: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6450: 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  f changes made t
6460: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
6470: 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a  y the last SQL.*
6480: 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a  * execution..*/.
6490: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
64a0: 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20  changes(.  void 
64b0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
64c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
64d0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
64e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
64f0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
6500: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
6510: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
6520: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6530: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
6540: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
6550: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c   \"",.       Tcl
6560: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
6570: 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
6580: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6590: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
65a0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
65b0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
65c0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
65d0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
65e0: 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
65f0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
6600: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
6610: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
6620: 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  b)));.  return T
6630: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
6640: 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61  This is the "sta
6650: 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20  tic_bind_value" 
6660: 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61  that variables a
6670: 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e  re bound to when
6680: 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74  .** the FLAG opt
6690: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62  ion of sqlite3_b
66a0: 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a  ind is "static".
66b0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
66c0: 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
66d0: 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 0a 2f  nd_value = 0;../
66e0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
66f0: 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49  ite3_bind  VM  I
6700: 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53  DX  VALUE  FLAGS
6710: 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20  .**.** Sets the 
6720: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58  value of the IDX
6730: 2d 74 68 20 6f 63 63 75 72 61 6e 63 65 20 6f 66  -th occurance of
6740: 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67   "?" in the orig
6750: 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69  inal SQL.** stri
6760: 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68  ng.  VALUE is th
6770: 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66  e new value.  If
6780: 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74   FLAGS=="null" t
6790: 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20  hen VALUE is.** 
67a0: 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20  ignored and the 
67b0: 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
67c0: 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d  NULL.  If FLAGS=
67d0: 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a  ="static" then.*
67e0: 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73  * the value is s
67f0: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
6800: 6f 66 20 61 20 73 74 61 74 69 63 20 76 61 72 69  of a static vari
6810: 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73  able named.** "s
6820: 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
6830: 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c  d_value".  If FL
6840: 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68  AGS=="normal" th
6850: 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  en a copy.** of 
6860: 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64  the VALUE is mad
6870: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6880: 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f   test_bind(.  vo
6890: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
68a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
68b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
68c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
68d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
68e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
68f0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
6900: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6910: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
6920: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
6930: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
6940: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
6950: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
6960: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
6970: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
6980: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
6990: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
69a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
69b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
69c0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
69d0: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
69e0: 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75  VM IDX VALUE (nu
69f0: 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c  ll|static|normal
6a00: 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  )\"", 0);.    re
6a10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6a20: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
6a30: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
6a40: 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74   argv[1], &pStmt
6a50: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
6a60: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
6a70: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
6a80: 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  rgv[2], &idx) ) 
6a90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6aa0: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61  ;.  if( strcmp(a
6ab0: 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d  rgv[4],"null")==
6ac0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
6ad0: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
6ae0: 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d  pStmt, idx);.  }
6af0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
6b00: 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22  argv[4],"static"
6b10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
6b20: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
6b30: 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73  xt(pStmt, idx, s
6b40: 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
6b50: 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b  d_value, -1, 0);
6b60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6b70: 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72  cmp(argv[4],"nor
6b80: 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mal")==0 ){.    
6b90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
6ba0: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
6bb0: 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20  x, argv[3], -1, 
6bc0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
6bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6be0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6bf0: 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72  (interp, "4th ar
6c00: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
6c10: 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75   ".        "\"nu
6c20: 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63  ll\" or \"static
6c30: 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22  \" or \"normal\"
6c40: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
6c50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
6c60: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6c70: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
6c80: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
6c90: 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
6ca0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6cb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
6cc0: 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
6cd0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
6ce0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6cf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
6d00: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
6d10: 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
6d20: 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
6d30: 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
6d40: 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
6d50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6d60: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
6d70: 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
6d80: 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
6d90: 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
6da0: 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
6db0: 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
6dc0: 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
6dd0: 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
6de0: 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
6df0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
6e00: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
6e10: 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
6e20: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
6e30: 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
6e40: 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
6e50: 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
6e60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6e70: 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
6e80: 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
6e90: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
6ea0: 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
6eb0: 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
6ec0: 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
6ed0: 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
6ee0: 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
6ef0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
6f00: 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
6f10: 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
6f20: 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
6f30: 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
6f40: 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
6f50: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
6f60: 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
6f70: 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
6f80: 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
6f90: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
6fa0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
6fb0: 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
6fc0: 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
6fd0: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
6fe0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
6ff0: 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
7000: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
7010: 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
7020: 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
7030: 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
7040: 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
7050: 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
7060: 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
7070: 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
7080: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
7090: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
70a0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
70b0: 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
70c0: 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
70d0: 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
70e0: 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
70f0: 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
7100: 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
7110: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
7120: 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
7130: 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70  k with one intep
7140: 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
7150: 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
7160: 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
7170: 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
7180: 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
7190: 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
71a0: 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
71b0: 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
71c0: 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
71d0: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
71e0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
71f0: 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
7200: 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
7210: 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
7220: 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
7230: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
7240: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7250: 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
7260: 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
7270: 69 6e 20 3d 20 28 69 6e 74 29 70 43 74 78 3b 0a  in = (int)pCtx;.
7280: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 73 71    int res;..  sq
7290: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
72a0: 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  l;.  Tcl_Obj *pX
72b0: 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  ;..  pX = Tcl_Ne
72c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
72d0: 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a  _collate", -1);.
72e0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
72f0: 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63  nt(pX);..  switc
7300: 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20  h( encin ){.    
7310: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38  case SQLITE_UTF8
7320: 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
7330: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
7340: 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
7350: 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d  ingObj("UTF-8",-
7360: 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
7370: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7380: 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
7390: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
73a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
73b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
73c0: 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b  "UTF-16LE",-1));
73d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
73e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
73f0: 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16BE:.      Tcl
7400: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7410: 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
7420: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
7430: 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16BE",-1));.   
7440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
7450: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
7460: 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 70  ert(0);.  }..  p
7470: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
7480: 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74  ueNew();.  sqlit
7490: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
74a0: 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69  al, nA, zA, enci
74b0: 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
74c0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
74d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
74e0: 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
74f0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
7500: 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 29  e_text(pVal),-1)
7510: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
7520: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42  eSetStr(pVal, nB
7530: 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zB, encin, SQL
7540: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 54  ITE_STATIC);.  T
7550: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7560: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
7570: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
7580: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7590: 28 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20 20 73  (pVal),-1));.  s
75a0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
75b0: 70 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45 76  pVal);..  Tcl_Ev
75c0: 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30  alObjEx(i, pX, 0
75d0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
75e0: 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
75f0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
7600: 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
7610: 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20  lt(i), &res);.  
7620: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74  return res;.}.st
7630: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
7640: 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  llate(.  void * 
7650: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
7660: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7670: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
7680: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
7690: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
76a0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
76b0: 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
76c0: 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
76d0: 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61 74  s;.  pTestCollat
76e0: 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  eInterp = interp
76f0: 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
7700: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
7710: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
7720: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
7730: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
7740: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
7750: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
7760: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
7770: 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
7780: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7790: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
77a0: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65  ollation(db, "te
77b0: 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
77c0: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
77d0: 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
77e0: 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74  E_UTF8, val?test
77f0: 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
7800: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
7810: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
7820: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
7830: 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
7840: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7850: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
7860: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
7870: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
7880: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
7890: 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a  .        (void *
78a0: 29 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c  )SQLITE_UTF16LE,
78b0: 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
78c0: 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28  e_func:0);.  if(
78d0: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
78e0: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
78f0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
7900: 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
7910: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
7920: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
7930: 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
7940: 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
7950: 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
7960: 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
7970: 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65  _UTF16BE, val?te
7980: 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
7990: 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
79a0: 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
79b0: 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
79c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
79d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
79e0: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
79f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
7a00: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
7a10: 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
7a20: 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
7a30: 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65  16be>", 0);.  re
7a40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7a50: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  }..static int sq
7a60: 6c 69 74 65 33 5f 63 72 61 73 68 73 65 65 64 28  lite3_crashseed(
7a70: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
7a80: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
7a90: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
7aa0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
7ab0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
7ac0: 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53  ){.#ifdef OS_TES
7ad0: 54 0a 20 20 69 6e 74 20 73 65 65 64 3b 0a 20 20  T.  int seed;.  
7ae0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f  if( objc!=2 ) go
7af0: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
7b00: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
7b10: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
7b20: 76 5b 31 5d 2c 20 26 73 65 65 64 29 20 29 20 72  v[1], &seed) ) r
7b30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7b40: 0a 20 20 73 71 6c 69 74 65 33 53 65 74 43 72 61  .  sqlite3SetCra
7b50: 73 68 73 65 65 64 28 73 65 65 64 29 3b 0a 23 65  shseed(seed);.#e
7b60: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
7b70: 4c 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 4f 53  L_OK;..#ifdef OS
7b80: 5f 54 45 53 54 0a 62 61 64 5f 61 72 67 73 3a 0a  _TEST.bad_args:.
7b90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7ba0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
7bb0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
7bc0: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54   be \"",.      T
7bd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7be0: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
7bf0: 20 22 3c 73 65 65 64 3e 22 2c 20 30 29 3b 0a 20   "<seed>", 0);. 
7c00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7c10: 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  R;.#endif.}.../*
7c20: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72  .** Usage:    br
7c30: 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
7c40: 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73  his routine exis
7c50: 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f  ts for one purpo
7c60: 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20  se - to provide 
7c70: 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61  a place to put a
7c80: 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77  .** breakpoint w
7c90: 69 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e  ith GDB that can
7ca0: 20 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73   be triggered us
7cb0: 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54  ing TCL code.  T
7cc0: 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68  he use.** for th
7cd0: 69 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72  is is when a par
7ce0: 74 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69  ticular test fai
7cf0: 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20  ls on (say) the 
7d00: 31 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e  1485th iteration
7d10: 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20  ..** In the TCL 
7d20: 74 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20  test script, we 
7d30: 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b  can add code lik
7d40: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
7d50: 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20    if {$i==1485} 
7d60: 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
7d70: 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69   Then run testfi
7d80: 78 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62  xture in the deb
7d90: 75 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66  ugger and wait f
7da0: 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e  or the breakpoin
7db0: 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54  t to.** fire.  T
7dc0: 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62  hen additional b
7dd0: 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62  reakpoints can b
7de0: 65 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64  e set to trace d
7df0: 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a  own the bug..*/.
7e00: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
7e10: 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f  breakpoint(.  vo
7e20: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
7e30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7e40: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
7e50: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
7e60: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
7e70: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
7e80: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
7e90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7ea0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
7eb0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
7ec0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
7ed0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
7ee0: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  /.){.  return TC
7ef0: 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  L_OK;         /*
7f00: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d   Do nothing */.}
7f10: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
7f20: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7f30: 74 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  t  STMT N VALUE.
7f40: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
7f50: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
7f60: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
7f70: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
7f80: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
7f90: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
7fa0: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
7fb0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
7fc0: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
7fd0: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32  nd.** binds a 32
7fe0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
7ff0: 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
8000: 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
8010: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74  nt test_bind_int
8020: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
8030: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
8040: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
8050: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
8060: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
8070: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
8080: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
8090: 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75   idx;.  int valu
80a0: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
80b0: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
80c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
80d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
80e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
80f0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
8100: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
8110: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
8120: 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
8130: 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
8140: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8150: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
8160: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
8170: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
8180: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
8190: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
81a0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
81b0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
81c0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
81d0: 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
81e0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
81f0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
8200: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
8210: 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
8220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
8230: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
8240: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78  d_int(pStmt, idx
8250: 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
8260: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8270: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8280: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
8290: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
82a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
82b0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
82c0: 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  64  STMT N VALUE
82d0: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
82e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
82f0: 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
8300: 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
8310: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
8320: 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
8330: 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
8340: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
8350: 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
8360: 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
8370: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
8380: 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
8390: 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
83a0: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
83b0: 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
83c0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
83d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
83e0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
83f0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
8400: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
8410: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
8420: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34    int idx;.  i64
8430: 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
8440: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
8450: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8460: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8470: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8480: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
8490: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
84a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
84b0: 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
84c0: 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
84d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
84e0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
84f0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
8500: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
8510: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
8520: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
8530: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
8540: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
8550: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
8560: 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
8570: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
8580: 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
8590: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
85a0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
85b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
85c0: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
85d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
85e0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
85f0: 75 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ue);.  if( rc!=S
8600: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8610: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8620: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8630: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
8640: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
8650: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20  e3_bind_double  
8660: 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
8670: 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
8680: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
8690: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
86a0: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
86b0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
86c0: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
86d0: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
86e0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
86f0: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
8700: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34  nd.** binds a 64
8710: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
8720: 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
8730: 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
8740: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75  nt test_bind_dou
8750: 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ble(.  void * cl
8760: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
8770: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
8780: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
8790: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
87a0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
87b0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
87c0: 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c  int idx;.  doubl
87d0: 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  e value;.  int r
87e0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
87f0: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
8800: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8810: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
8820: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
8830: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
8840: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8850: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
8860: 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
8870: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8880: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
8890: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
88a0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
88b0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
88c0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
88d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
88e0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
88f0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
8900: 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
8910: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8920: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
8930: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
8940: 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
8950: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
8960: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
8970: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
8980: 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  e(pStmt, idx, va
8990: 6c 75 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  lue);.  if( rc!=
89a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
89b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
89c0: 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
89d0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
89e0: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
89f0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54  e3_bind_null  ST
8a00: 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  MT N.**.** Test 
8a10: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
8a20: 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  _null interface.
8a30: 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
8a40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
8a50: 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
8a60: 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
8a70: 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
8a80: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
8a90: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
8aa0: 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  s a NULL to the 
8ab0: 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
8ac0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
8ad0: 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a  d_null(.  void *
8ae0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
8af0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8b00: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
8b10: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
8b20: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
8b30: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
8b40: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
8b50: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
8b60: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
8b70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8b80: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8b90: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8ba0: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
8bb0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
8bc0: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
8bd0: 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20  TMT N", 0);.    
8be0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8bf0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
8c00: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
8c10: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
8c20: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
8c30: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
8c40: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
8c50: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
8c60: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
8c70: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
8c80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
8c90: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
8ca0: 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29  null(pStmt, idx)
8cb0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8cc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
8cd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8ce0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
8cf0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
8d00: 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
8d10: 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e  ind_text  STMT N
8d20: 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
8d30: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
8d40: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69  ite3_bind_text i
8d50: 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
8d60: 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
8d70: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
8d80: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
8d90: 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
8da0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8db0: 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
8dc0: 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
8dd0: 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47  -8 string STRING
8de0: 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
8df0: 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
8e00: 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20   BYTES bytes.** 
8e10: 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  long..*/.static 
8e20: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  int test_bind_te
8e30: 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  xt(.  void * cli
8e40: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
8e50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
8e60: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
8e70: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
8e80: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
8e90: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
8ea0: 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
8eb0: 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
8ec0: 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
8ed0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
8ee0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8ef0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8f00: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8f10: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
8f20: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
8f30: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
8f40: 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
8f50: 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
8f60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8f70: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
8f80: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
8f90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
8fa0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
8fb0: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
8fc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
8fd0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
8fe0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
8ff0: 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
9000: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9010: 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74   value = Tcl_Get
9020: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
9030: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
9040: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
9050: 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
9060: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9070: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
9080: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
9090: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
90a0: 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
90b0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
90c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
90d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
90e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
90f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9100: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
9110: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
9120: 65 78 74 31 36 20 20 53 54 4d 54 20 4e 20 53 54  ext16  STMT N ST
9130: 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  RING BYTES.**.**
9140: 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
9150: 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e  3_bind_text16 in
9160: 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
9170: 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
9180: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
9190: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
91a0: 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
91b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
91c0: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
91d0: 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d  .** binds a UTF-
91e0: 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47  16 string STRING
91f0: 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
9200: 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
9210: 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20   BYTES bytes.** 
9220: 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  long..*/.static 
9230: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  int test_bind_te
9240: 78 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  xt16(.  void * c
9250: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
9260: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9270: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
9280: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
9290: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
92a0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
92b0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
92c0: 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
92d0: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
92e0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
92f0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
9300: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9310: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9320: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
9330: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
9340: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
9350: 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
9360: 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29  VALUE BYTES", 0)
9370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
9390: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
93a0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
93b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
93c0: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
93d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
93e0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
93f0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
9400: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
9410: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9420: 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
9430: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
9440: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a  bj(objv[3], 0);.
9450: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9460: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
9470: 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
9480: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9490: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
94a0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
94b0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f  (pStmt, idx, (vo
94c0: 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65  id *)value, byte
94d0: 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  s, SQLITE_TRANSI
94e0: 45 4e 54 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ENT);.  if( rc!=
94f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9500: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9510: 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
9520: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
9530: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
9540: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 53 54  e3_bind_blob  ST
9550: 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a  MT N DATA BYTES.
9560: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
9570: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
9580: 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
9590: 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
95a0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
95b0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
95c0: 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
95d0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
95e0: 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
95f0: 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42  and.** binds a B
9600: 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
9610: 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69  ard.  The BLOB i
9620: 73 20 42 59 54 45 53 20 62 79 74 65 73 20 69 6e  s BYTES bytes in
9630: 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
9640: 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 62   int test_bind_b
9650: 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
9660: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
9670: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
9680: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
9690: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
96a0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
96b0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
96c0: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
96d0: 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
96e0: 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
96f0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
9700: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9710: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9720: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9730: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
9740: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
9750: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
9760: 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44  , 0), " STMT N D
9770: 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  ATA BYTES", 0);.
9780: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9790: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
97a0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
97b0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
97c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
97d0: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
97e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
97f0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
9800: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
9810: 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
9820: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9830: 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74   value = Tcl_Get
9840: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
9850: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
9860: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
9870: 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
9880: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9890: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
98a0: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
98b0: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
98c0: 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
98d0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
98e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
98f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
9900: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
9910: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9920: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
9930: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
9940: 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
9950: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
9960: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
9970: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
9980: 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72  ite3_* API.** er
9990: 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22  ror code. e.g. "
99a0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a  SQLITE_ERROR"..*
99b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
99c0: 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69  t_errcode(.  voi
99d0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
99e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
99f0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
9a00: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
9a10: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
9a20: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
9a30: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
9a40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9a50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
9a60: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
9a70: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
9a80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9a90: 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
9aa0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
9ab0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9ac0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
9ad0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9ae0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
9af0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
9b00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
9b10: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
9b20: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
9b30: 61 6d 65 28 73 71 6c 69 74 65 33 5f 65 72 72 63  ame(sqlite3_errc
9b40: 6f 64 65 28 64 62 29 29 2c 20 30 29 3b 0a 20 20  ode(db)), 0);.  
9b50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9b60: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9b70: 20 74 65 73 74 5f 65 72 72 6d 73 67 20 44 42 0a   test_errmsg DB.
9b80: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
9b90: 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e  e UTF-8 represen
9ba0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
9bb0: 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
9bc0: 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
9bd0: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
9be0: 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f  3_* API call..*/
9bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
9c00: 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20  _errmsg(.  void 
9c10: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
9c20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9c30: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
9c40: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
9c50: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
9c60: 69 74 65 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  ite *db;.  const
9c70: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20   char *zErr;..  
9c80: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
9c90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9ca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9cb0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9cc0: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
9cd0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
9ce0: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
9cf0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9d00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9d10: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
9d20: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
9d30: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
9d40: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
9d50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45  TCL_ERROR;..  zE
9d60: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rr = sqlite3_err
9d70: 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  msg(db);.  Tcl_S
9d80: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
9d90: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
9da0: 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b  gObj(zErr, -1));
9db0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9dd0: 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31  :   test_errmsg1
9de0: 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  6 DB.**.** Retur
9df0: 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20 72 65  ns the UTF-16 re
9e00: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
9e10: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9e20: 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  e string for the
9e30: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  .** most recent 
9e40: 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61  sqlite3_* API ca
9e50: 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62 79  ll. This is a by
9e60: 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74 20  te array object 
9e70: 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c  at the TCL .** l
9e80: 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63  evel, and it inc
9e90: 6c 75 64 65 73 20 74 68 65 20 30 78 30 30 20 30  ludes the 0x00 0
9ea0: 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 62  x00 terminator b
9eb0: 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20  ytes at the end 
9ec0: 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36  of the.** UTF-16
9ed0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
9ee0: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
9ef0: 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  sg16(.  void * c
9f00: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
9f10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9f20: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
9f30: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
9f40: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
9f50: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
9f60: 69 64 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20  id *zErr;.  int 
9f70: 62 79 74 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62  bytes;..  if( ob
9f80: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
9f90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9fa0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
9fb0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
9fc0: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
9fd0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
9fe0: 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
9ff0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a000: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
a010: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
a020: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
a030: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
a040: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a050: 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
a060: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
a070: 64 62 29 3b 0a 20 20 62 79 74 65 73 20 3d 20 73  db);.  bytes = s
a080: 71 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c  qlite3utf16ByteL
a090: 65 6e 28 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20  en(zErr, -1);.  
a0a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
a0b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
a0c0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72  ByteArrayObj(zEr
a0d0: 72 2c 20 62 79 74 65 73 29 29 3b 0a 20 20 72 65  r, bytes));.  re
a0e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a0f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
a100: 69 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20  ite3_prepare DB 
a110: 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
a120: 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  r.**.** Compile 
a130: 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
a140: 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
a150: 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
a160: 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
a170: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
a180: 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
a190: 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
a1a0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
a1b0: 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
a1c0: 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
a1d0: 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
a1e0: 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
a1f0: 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
a200: 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
a210: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a220: 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20   test_prepare(. 
a230: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
a240: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
a250: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
a260: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
a270: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
a280: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
a290: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
a2a0: 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
a2b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a2c0: 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
a2d0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
a2e0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
a2f0: 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
a300: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
a310: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
a320: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a330: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
a340: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
a350: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
a360: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
a370: 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
a380: 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
a390: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a3a0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
a3b0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
a3c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
a3d0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
a3e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a3f0: 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
a400: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
a410: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
a420: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a430: 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
a440: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a450: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
a460: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
a470: 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
a480: 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a  pStmt, &zTail);.
a490: 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
a4a0: 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
a4b0: 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
a4c0: 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d   bytes - (zTail-
a4d0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
a4e0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
a4f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
a500: 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
a510: 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
a520: 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
a530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a540: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a550: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
a560: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
a570: 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
a580: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a590: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
a5a0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
a5b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a5c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a5d0: 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
a5e0: 20 20 20 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e      if( makePoin
a5f0: 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
a600: 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
a610: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a620: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a630: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
a640: 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
a650: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a660: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
a670: 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73  te3_prepare DB s
a680: 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
a690: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
a6a0: 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
a6b0: 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
a6c0: 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
a6d0: 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
a6e0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
a6f0: 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
a700: 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
a710: 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
a720: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
a730: 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
a740: 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
a750: 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
a760: 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
a770: 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
a780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a790: 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a  test_prepare16(.
a7a0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
a7b0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
a7c0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
a7d0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
a7e0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
a7f0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
a800: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
a810: 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Sql;.  const voi
a820: 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  d *zTail = 0;.  
a830: 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d  Tcl_Obj *pTail =
a840: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
a850: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
a860: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
a870: 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
a880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a890: 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
a8a0: 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
a8b0: 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a8d0: 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
a8e0: 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
a8f0: 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
a900: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
a910: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a920: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
a930: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
a940: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
a950: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
a960: 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
a970: 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
a980: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a990: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
a9a0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
a9b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
a9c0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
a9d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a9e0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
a9f0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
aa00: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
aa10: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
aa20: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
aa30: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
aa40: 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
aa50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
aa60: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
aa70: 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
aa80: 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
aa90: 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 20  &pStmt, &zTail) 
aaa0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
aab0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
aac0: 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
aad0: 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e   objlen = objlen
aae0: 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d   - ((u8 *)zTail-
aaf0: 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d  (u8 *)zSql);.  }
ab00: 65 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e  else{.    objlen
ab10: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69   = 0;.  }.  pTai
ab20: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
ab30: 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
ab40: 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
ab50: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
ab60: 28 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f  (pTail);.  Tcl_O
ab70: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
ab80: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54  , objv[4], 0, pT
ab90: 61 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ail, 0);.  Tcl_D
aba0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
abb0: 6c 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  l);..  if( pStmt
abc0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 6b 65   ){.    if( make
abd0: 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
abe0: 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
abf0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ac00: 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  OR;.  }.  Tcl_Ap
ac10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ac20: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
ac30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ac40: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ac50: 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e  lite3_open filen
ac60: 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73  ame ?options-lis
ac70: 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t?.*/.static int
ac80: 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f   test_open(.  vo
ac90: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
aca0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
acb0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
acc0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
acd0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ace0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
acf0: 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
ad00: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
ad10: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
ad20: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
ad30: 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
ad40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ad50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ad60: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ad70: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
ad80: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
ad90: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
ada0: 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
adb0: 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
adc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
add0: 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
ade0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
adf0: 62 6a 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20  bjv[1]);.  rc = 
ae00: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
ae10: 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
ae20: 0a 20 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74  .  if( makePoint
ae30: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
ae40: 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
ae50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
ae60: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ae70: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
ae80: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
ae90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
aea0: 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  : sqlite3_open16
aeb0: 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
aec0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
aed0: 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76  test_open16(.  v
aee0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
aef0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
af00: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
af10: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
af20: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
af30: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
af40: 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
af50: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
af60: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
af70: 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
af80: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
af90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
afa0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
afb0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
afc0: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
afd0: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
afe0: 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  " filename optio
aff0: 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  ns-list", 0);.  
b000: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b010: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65  OR;.  }..  zFile
b020: 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79  name = Tcl_GetBy
b030: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
b040: 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63  bjv[1], 0);.  rc
b050: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31   = sqlite3_open1
b060: 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  6(zFilename, &db
b070: 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d 61 6b 65  );.  .  if( make
b080: 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
b090: 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
b0a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b0b0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
b0c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
b0d0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
b0e0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b0f0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73  Usage: sqlite3_s
b100: 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41  tep STMT.**.** A
b110: 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65  dvance the state
b120: 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  ment to the next
b130: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
b140: 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20  int test_step(. 
b150: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
b160: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
b170: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
b180: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
b190: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
b1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
b1b0: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
b1c0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
b1d0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
b1e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b1f0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
b200: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
b210: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
b220: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
b230: 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
b240: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b250: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
b260: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
b270: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b280: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
b290: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
b2a0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
b2b0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
b2c0: 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63  t);..  /* if( rc
b2d0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26  !=SQLITE_DONE &&
b2e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
b2f0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b300: 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  OR; */.  Tcl_Set
b310: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
b320: 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65  char *)errorName
b330: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
b340: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
b350: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
b360: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  e3_column_count 
b370: 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
b380: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
b390: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
b3a0: 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
b3b0: 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
b3c0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
b3d0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20  column_count(.  
b3e0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
b3f0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
b400: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
b410: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
b420: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
b430: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
b440: 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
b450: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
b460: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b470: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
b480: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
b490: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
b4a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
b4b0: 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
b4c0: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
b4d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b4e0: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
b4f0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b500: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b510: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
b520: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b530: 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
b540: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
b550: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
b560: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
b570: 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
b580: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b590: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
b5a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
b5b0: 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
b5c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
b5d0: 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  ype of the data 
b5e0: 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
b5f0: 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
b600: 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
b610: 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
b620: 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
b630: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
b640: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b650: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
b660: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
b670: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
b680: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
b690: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
b6a0: 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   tp;..  if( objc
b6b0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
b6c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b6d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
b6e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
b6f0: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
b700: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
b710: 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
b720: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
b730: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b740: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
b750: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
b760: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b770: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
b780: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b790: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
b7a0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
b7b0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
b7c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b7d0: 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c  ROR;..  tp = sql
b7e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
b7f0: 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
b800: 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20  switch( tp ){.  
b810: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
b820: 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63  TEGER: .      Tc
b830: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
b840: 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54  rp, "INTEGER", T
b850: 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
b860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b870: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a  se SQLITE_NULL:.
b880: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
b890: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c  ult(interp, "NUL
b8a0: 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  L", TCL_STATIC);
b8b0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
b8c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
b8d0: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  LOAT:.      Tcl_
b8e0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b8f0: 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53  , "FLOAT", TCL_S
b900: 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
b910: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
b920: 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20  QLITE_TEXT:.    
b930: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
b940: 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20  interp, "TEXT", 
b950: 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
b960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b970: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
b980: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
b990: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c  sult(interp, "BL
b9a0: 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  OB", TCL_STATIC)
b9b0: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
b9c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
b9d0: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
b9e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
b9f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
ba00: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
ba10: 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f  mn_int64 STMT co
ba20: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
ba30: 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
ba40: 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
ba50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
ba60: 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77   cast as an.** w
ba70: 69 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74  ide (64-bit) int
ba80: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
ba90: 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
baa0: 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
bab0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
bac0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
bad0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
bae0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
baf0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
bb00: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
bb10: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34    int col;.  i64
bb20: 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   iVal;..  if( ob
bb30: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
bb40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bb50: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
bb60: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
bb70: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
bb80: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
bb90: 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
bba0: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
bbb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bbc0: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
bbd0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
bbe0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
bbf0: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
bc00: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
bc10: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
bc20: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
bc30: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
bc40: 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
bc50: 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d  ERROR;..  iVal =
bc60: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
bc70: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c  int64(pStmt, col
bc80: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
bc90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
bca0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
bcb0: 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  iVal));.  return
bcc0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
bcd0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
bce0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d  _column_blob STM
bcf0: 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
bd00: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
bd10: 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  mn_blob(.  void 
bd20: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
bd30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
bd40: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
bd50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
bd60: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
bd70: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
bd80: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20  ;.  int col;..  
bd90: 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74  int len;.  const
bda0: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20   void *pBlob;.. 
bdb0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
bdc0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
bdd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
bde0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
bdf0: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
be00: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
be10: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
be20: 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
be30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
be40: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
be50: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
be60: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
be70: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
be80: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
be90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
bea0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
beb0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
bec0: 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
bed0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
bee0: 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
bef0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
bf00: 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 6c 65 6e 20  mt, col);.  len 
bf10: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
bf20: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f  _bytes(pStmt, co
bf30: 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
bf40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
bf50: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
bf60: 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b  bj(pBlob, len));
bf70: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
bf80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
bf90: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
bfa0: 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c  _double STMT col
bfb0: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
bfc0: 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
bfd0: 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
bfe0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
bff0: 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65  cast as a double
c000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c010: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
c020: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
c030: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
c040: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
c050: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
c060: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
c070: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
c080: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
c090: 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65  nt col;.  double
c0a0: 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   rVal;..  if( ob
c0b0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
c0c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c0d0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
c0e0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
c0f0: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
c100: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
c110: 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
c120: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
c130: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c140: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
c150: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
c160: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c170: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
c180: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c190: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
c1a0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
c1b0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
c1c0: 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
c1d0: 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d  ERROR;..  rVal =
c1e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c1f0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f  double(pStmt, co
c200: 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
c210: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
c220: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
c230: 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rVal));.  return
c240: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
c250: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
c260: 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54  _data_count STMT
c270: 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
c280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
c290: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
c2a0: 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
c2b0: 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
c2c0: 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61  ic int test_data
c2d0: 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
c2e0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
c2f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c300: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
c310: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
c320: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
c330: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
c340: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
c350: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
c360: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c370: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
c380: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
c390: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
c3a0: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
c3b0: 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
c3c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c3d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
c3e0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
c3f0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
c400: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
c410: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
c420: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
c430: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
c440: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
c450: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
c460: 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74  data_count(pStmt
c470: 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
c480: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
c490: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
c4a0: 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
c4b0: 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
c4c0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
c4d0: 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
c4e0: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
c4f0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
c500: 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
c510: 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
c520: 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  t test_stmt_utf8
c530: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
c540: 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  tData,        /*
c550: 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
c560: 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
c570: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a  to be invoke */.
c580: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
c590: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
c5a0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
c5b0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
c5c0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
c5d0: 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
c5e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78   const char *(*x
c5f0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
c600: 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65  mt*, int) = clie
c610: 6e 74 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  ntData;.  const 
c620: 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 69  char *zRet;..  i
c630: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
c640: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c650: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
c660: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
c670: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
c680: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c690: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
c6a0: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
c6b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c6c0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
c6d0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
c6e0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
c6f0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
c700: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
c710: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
c720: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
c730: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
c740: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
c750: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52   TCL_ERROR;.  zR
c760: 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74  et = xFunc(pStmt
c770: 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52  , col);.  if( zR
c780: 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  et ){.    Tcl_Se
c790: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
c7a0: 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29  (char *)zRet, 0)
c7b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
c7c0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
c7d0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
c7e0: 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
c7f0: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
c800: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
c810: 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
c820: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
c830: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
c840: 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
c850: 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
c860: 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  nt test_stmt_utf
c870: 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
c880: 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
c890: 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
c8a0: 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
c8b0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  o be invoked */.
c8c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
c8d0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
c8e0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
c8f0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
c900: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
c910: 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
c920: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
c930: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
c940: 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76  ame16;.  const v
c950: 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  oid *(*xFunc)(sq
c960: 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
c970: 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ) = clientData;.
c980: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
c990: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
c9a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c9b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
c9c0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
c9d0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
c9e0: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
c9f0: 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
ca00: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ca10: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
ca20: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
ca30: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
ca40: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
ca50: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
ca60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ca70: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
ca80: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
ca90: 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
caa0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cab0: 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75  .  zName16 = xFu
cac0: 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
cad0: 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b    if( zName16 ){
cae0: 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  .    pRet = Tcl_
caf0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
cb00: 7a 4e 61 6d 65 31 36 2c 20 73 71 6c 69 74 65 33  zName16, sqlite3
cb10: 75 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 4e 61  utf16ByteLen(zNa
cb20: 6d 65 31 36 2c 20 2d 31 29 2b 32 29 3b 0a 20 20  me16, -1)+2);.  
cb30: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
cb40: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
cb50: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
cb60: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
cb70: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
cb80: 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20  column_int STMT 
cb90: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
cba0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
cbb0: 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f  mn_bytes STMT co
cbc0: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
cbd0: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
cbe0: 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f  _bytes16 STMT co
cbf0: 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  lumn.**.*/.stati
cc00: 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
cc10: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  int(.  void * cl
cc20: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a 20  ientData,    /* 
cc30: 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
cc40: 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
cc50: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  o be invoked */.
cc60: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
cc70: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
cc80: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
cc90: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
cca0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
ccb0: 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
ccc0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71   int (*xFunc)(sq
ccd0: 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
cce0: 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ) = clientData;.
ccf0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
cd00: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
cd10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cd20: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
cd30: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
cd40: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
cd50: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
cd60: 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
cd70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cd80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
cd90: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
cda0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
cdb0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
cdc0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
cdd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
cde0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
cdf0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
ce00: 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
ce10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ce20: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
ce30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
ce40: 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28  NewIntObj(xFunc(
ce50: 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20  pStmt, col)));. 
ce60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ce70: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
ce80: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
ce90: 61 64 57 72 69 74 65 20 3c 66 69 6c 65 6e 61 6d  adWrite <filenam
cea0: 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e>.*/.static int
ceb0: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f   test_sqlite3OsO
cec0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20  penReadWrite(.  
ced0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
cee0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
cef0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
cf00: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
cf10: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
cf20: 20 20 4f 73 46 69 6c 65 20 2a 20 70 46 69 6c 65    OsFile * pFile
cf30: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
cf40: 74 20 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20  t dummy;.  char 
cf50: 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
cf60: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
cf70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
cf80: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
cf90: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
cfa0: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
cfb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
cfc0: 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
cfd0: 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
cfe0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cff0: 20 7d 0a 0a 20 20 70 46 69 6c 65 20 3d 20 73 71   }..  pFile = sq
d000: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
d010: 66 28 4f 73 46 69 6c 65 29 29 3b 0a 20 20 72 63  f(OsFile));.  rc
d020: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
d030: 52 65 61 64 57 72 69 74 65 28 54 63 6c 5f 47 65  ReadWrite(Tcl_Ge
d040: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d050: 2c 20 70 46 69 6c 65 2c 20 26 64 75 6d 6d 79 29  , pFile, &dummy)
d060: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d070: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
d080: 69 74 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a  iteFree(pFile);.
d090: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
d0a0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
d0b0: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  *)errorName(rc),
d0c0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
d0d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d0e0: 4f 52 3b 0a 20 20 7d 0a 20 20 6d 61 6b 65 50 6f  OR;.  }.  makePo
d0f0: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
d100: 20 7a 42 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20   zBuf, pFile);. 
d110: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
d120: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
d130: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
d140: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
d150: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 43  age:  sqlite3OsC
d160: 6c 6f 73 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c  lose <file handl
d170: 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e>.*/.static int
d180: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43   test_sqlite3OsC
d190: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  lose(.  void * c
d1a0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
d1b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d1c0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
d1d0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
d1e0: 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65  jv[].){.  OsFile
d1f0: 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   * pFile;.  int 
d200: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
d210: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
d220: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d230: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d240: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d250: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
d260: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
d270: 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20   " filehandle", 
d280: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
d290: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
d2a0: 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e   if( getFilePoin
d2b0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
d2c0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
d2d0: 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20  ]), &pFile) ){. 
d2e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d2f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
d300: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
d310: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
d320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d330: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
d340: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
d350: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  errorName(rc), T
d360: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
d370: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d380: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
d390: 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74  ee(pFile);.  ret
d3a0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
d3b0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
d3c0: 69 74 65 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65  ite3OsLock <file
d3d0: 20 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79   handle> <lockty
d3e0: 70 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe>.*/.static in
d3f0: 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  t test_sqlite3Os
d400: 4c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63  Lock(.  void * c
d410: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
d420: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d430: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
d440: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
d450: 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65  jv[].){.  OsFile
d460: 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   * pFile;.  int 
d470: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
d480: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
d490: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d4a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d4b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d4c0: 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65   .        Tcl_Ge
d4d0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
d4e0: 2c 20 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c  , .        " fil
d4f0: 65 68 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c  ehandle (SHARED|
d500: 52 45 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47  RESERVED|PENDING
d510: 7c 45 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29  |EXCLUSIVE)", 0)
d520: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d530: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
d540: 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65  f( getFilePointe
d550: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
d560: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d570: 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  , &pFile) ){.   
d580: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d590: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d  R;.  }..  if( 0=
d5a0: 3d 73 74 72 63 6d 70 28 22 53 48 41 52 45 44 22  =strcmp("SHARED"
d5b0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
d5c0: 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20  objv[2])) ){.   
d5d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
d5e0: 6f 63 6b 28 70 46 69 6c 65 2c 20 53 48 41 52 45  ock(pFile, SHARE
d5f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65  D_LOCK);.  }.  e
d600: 6c 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d  lse if( 0==strcm
d610: 70 28 22 52 45 53 45 52 56 45 44 22 2c 20 54 63  p("RESERVED", Tc
d620: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d630: 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20  [2])) ){.    rc 
d640: 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
d650: 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
d660: 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73  LOCK);.  }.  els
d670: 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28  e if( 0==strcmp(
d680: 22 50 45 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47  "PENDING", Tcl_G
d690: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
d6a0: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  )) ){.    rc = s
d6b0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69  qlite3OsLock(pFi
d6c0: 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  le, PENDING_LOCK
d6d0: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
d6e0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 45 58 43  ( 0==strcmp("EXC
d6f0: 4c 55 53 49 56 45 22 2c 20 54 63 6c 5f 47 65 74  LUSIVE", Tcl_Get
d700: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
d710: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
d720: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65  ite3OsLock(pFile
d730: 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
d740: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d750: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d760: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
d770: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
d780: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  e \"", .        
d790: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d7a0: 6a 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20  jv[0]), .       
d7b0: 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53   " filehandle (S
d7c0: 48 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50  HARED|RESERVED|P
d7d0: 45 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45  ENDING|EXCLUSIVE
d7e0: 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  )", 0);.    retu
d7f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d800: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
d810: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
d820: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
d830: 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f  rp, (char *)erro
d840: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
d850: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
d860: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d870: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
d880: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
d890: 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  e:  sqlite3OsUnl
d8a0: 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65  ock <file handle
d8b0: 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
d8c0: 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e  test_sqlite3OsUn
d8d0: 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63  lock(.  void * c
d8e0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
d8f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d900: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
d910: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
d920: 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65  jv[].){.  OsFile
d930: 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   * pFile;.  int 
d940: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
d950: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
d960: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d970: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d980: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d990: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
d9a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
d9b0: 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20   " filehandle", 
d9c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
d9d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
d9e0: 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e   if( getFilePoin
d9f0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
da00: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
da10: 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20  ]), &pFile) ){. 
da20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
da30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
da40: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
da50: 70 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  pFile, NO_LOCK);
da60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
da70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
da80: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
da90: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
daa0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
dab0: 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
dac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
dad0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
dae0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
daf0: 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74  ter commands wit
db00: 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
db10: 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71  reter..*/.int Sq
db20: 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
db30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
db40: 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  p){.  extern int
db50: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
db60: 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
db70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  int sqlite3_inte
db80: 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65  rrupt_count;.  e
db90: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
dba0: 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  3_open_file_coun
dbb0: 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
dbc0: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
dbd0: 74 69 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 73  time;.  static s
dbe0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
dbf0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
dc00: 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  cl_CmdProc *xPro
dc10: 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20  c;.  } aCmd[] = 
dc20: 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  {.     { "sqlite
dc30: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  3_mprintf_int", 
dc40: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
dc50: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
dc60: 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d  mprintf_int    }
dc70: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
dc80: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22  3_mprintf_int64"
dc90: 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ,         (Tcl_C
dca0: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
dcb0: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d  mprintf_int64  }
dcc0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
dcd0: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20  3_mprintf_str", 
dce0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
dcf0: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
dd00: 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d  mprintf_str    }
dd10: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
dd20: 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
dd30: 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
dd40: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
dd50: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d  mprintf_double }
dd60: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
dd70: 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
dd80: 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
dd90: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
dda0: 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d  mprintf_scaled }
ddb0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
ddc0: 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
ddd0: 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
dde0: 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
ddf0: 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c  intf_z        },
de00: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
de10: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
de20: 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d  id",     (Tcl_Cm
de30: 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74  dProc*)test_last
de40: 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a  _rowid       },.
de50: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
de60: 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20  exec_printf",   
de70: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
de80: 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
de90: 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20  printf      },. 
dea0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
deb0: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22  et_table_printf"
dec0: 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
ded0: 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61  roc*)test_get_ta
dee0: 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20 20  ble_printf },.  
def0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
df00: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
df10: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
df20: 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
df30: 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20  close     },.   
df40: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
df50: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ate_function",  
df60: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
df70: 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66  c*)test_create_f
df80: 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20  unction  },.    
df90: 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
dfa0: 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20  te_aggregate",  
dfb0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
dfc0: 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  *)test_create_ag
dfd0: 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20  gregate },.     
dfe0: 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74  { "sqlite_regist
dff0: 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
e000: 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
e010: 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66  )test_register_f
e020: 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  unc    },.     {
e030: 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c   "sqlite_abort",
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
e060: 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20  sqlite_abort    
e070: 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20        },.#ifdef 
e080: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
e090: 20 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c    { "sqlite_mall
e0a0: 6f 63 5f 66 61 69 6c 22 2c 20 20 20 20 20 20 20  oc_fail",       
e0b0: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
e0c0: 63 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  c*)sqlite_malloc
e0d0: 5f 66 61 69 6c 20 20 20 20 7d 2c 0a 20 20 20 20  _fail    },.    
e0e0: 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   { "sqlite_mallo
e0f0: 63 5f 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  c_stat",        
e100: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
e110: 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  *)sqlite_malloc_
e120: 73 74 61 74 20 20 20 20 7d 2c 0a 23 65 6e 64 69  stat    },.#endi
e130: 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
e140: 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20  _bind",         
e150: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
e160: 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69  CmdProc*)test_bi
e170: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  nd             }
e180: 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70  ,.     { "breakp
e190: 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  oint",          
e1a0: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
e1b0: 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72  CmdProc*)test_br
e1c0: 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d  eakpoint       }
e1d0: 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
e1e0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
e1f0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
e200: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a  Tcl_ObjCmdProc *
e210: 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64  xProc;.     void
e220: 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20   *clientData;.  
e230: 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a  } aObjCmd[] = {.
e240: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
e250: 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20  bind_int",      
e260: 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
e270: 64 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c  d_int,      0 },
e280: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
e290: 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20  _bind_int64",   
e2a0: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
e2b0: 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d  nd_int64,    0 }
e2c0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
e2d0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20  3_bind_double", 
e2e0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
e2f0: 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20  ind_double,   0 
e300: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
e310: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20  e3_bind_null",  
e320: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
e330: 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30  bind_null     ,0
e340: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
e350: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20  te3_bind_text", 
e360: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
e370: 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c  _bind_text     ,
e380: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
e390: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
e3a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
e3b0: 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20  t_bind_text16   
e3c0: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
e3d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22  lite3_bind_blob"
e3e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
e3f0: 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20  st_bind_blob    
e400: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
e410: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcode",
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
e430: 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20  est_errcode     
e440: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
e450: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c  sqlite3_errmsg",
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20  test_errmsg     
e480: 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
e490: 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  "sqlite3_errmsg1
e4a0: 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
e4b0: 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20   test_errmsg16  
e4c0: 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
e4d0: 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c   "sqlite3_open",
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20    test_open     
e500: 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
e510: 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  { "sqlite3_open1
e520: 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
e530: 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20     test_open16  
e540: 20 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20        ,0 },..   
e550: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
e560: 70 61 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  pare",          
e570: 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
e580: 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e       ,0 },.  
e590: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
e5a0: 65 70 61 72 65 31 36 22 2c 20 20 20 20 20 20 20  epare16",       
e5b0: 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
e5c0: 72 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20  re16     ,0 },. 
e5d0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66      { "sqlite3_f
e5e0: 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20  inalize",       
e5f0: 20 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61         test_fina
e600: 6c 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a  lize      ,0 },.
e610: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
e620: 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20  reset",         
e630: 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73          test_res
e640: 65 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  et         ,0 },
e650: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
e660: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  _changes",      
e670: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 68           test_ch
e680: 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d  anges       ,0 }
e690: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
e6a0: 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20 20  3_step",        
e6b0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
e6c0: 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30 20  tep          ,0 
e6d0: 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69  },..     /* sqli
e6e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41  te3_column_*() A
e6f0: 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71  PI */.     { "sq
e700: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
e710: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  nt",          te
e720: 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  st_column_count 
e730: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
e740: 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
e750: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  t",            t
e760: 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20  est_data_count  
e770: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
e780: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
e790: 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
e7a0: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  test_column_type
e7b0: 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
e7c0: 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
e7d0: 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  blob",          
e7e0: 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f   test_column_blo
e7f0: 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  b   ,0 },.     {
e800: 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
e810: 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
e820: 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f    test_column_do
e830: 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20  uble ,0 },.     
e840: 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
e850: 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  n_int64",       
e860: 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69     test_column_i
e870: 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20  nt64  ,0 },.    
e880: 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
e890: 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  mn_int",        
e8a0: 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
e8b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e8c0: 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  int       },.   
e8d0: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
e8e0: 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 20 20 20  umn_bytes",     
e8f0: 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
e900: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
e910: 5f 62 79 74 65 73 20 20 20 20 20 7d 2c 0a 20 20  _bytes     },.  
e920: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
e930: 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20  lumn_bytes16",  
e940: 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c    test_stmt_int,
e950: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
e960: 6e 5f 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20  n_bytes16   },. 
e970: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
e980: 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 20  olumn_text",    
e990: 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
e9a0: 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  8,  sqlite3_colu
e9b0: 6d 6e 5f 74 65 78 74 20 20 20 20 20 20 7d 2c 0a  mn_text      },.
e9c0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
e9d0: 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22  column_decltype"
e9e0: 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ,   test_stmt_ut
e9f0: 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  f8,  sqlite3_col
ea00: 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 20 7d 2c  umn_decltype  },
ea10: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
ea20: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20  _column_name",  
ea30: 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75       test_stmt_u
ea40: 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f  tf8,  sqlite3_co
ea50: 6c 75 6d 6e 5f 6e 61 6d 65 20 20 20 20 20 20 7d  lumn_name      }
ea60: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
ea70: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22  3_column_text16"
ea80: 2c 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  ,     test_stmt_
ea90: 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63  utf16, sqlite3_c
eaa0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 20 20 20 20  olumn_text16    
eab0: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
eac0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
ead0: 70 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  pe16", test_stmt
eae0: 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f  _utf16, sqlite3_
eaf0: 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31  column_decltype1
eb00: 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  6},.     { "sqli
eb10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
eb20: 36 22 2c 20 20 20 20 20 74 65 73 74 5f 73 74 6d  6",     test_stm
eb30: 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33  t_utf16, sqlite3
eb40: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 20 20  _column_name16  
eb50: 20 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75    },..     /* Fu
eb60: 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e  nctions from os.
eb70: 68 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c  h */.     { "sql
eb80: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
eb90: 69 74 65 22 2c 74 65 73 74 5f 73 71 6c 69 74 65  ite",test_sqlite
eba0: 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
ebb0: 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
ebc0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 22 2c 20  qlite3OsClose", 
ebd0: 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69         test_sqli
ebe0: 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30 20 7d 2c  te3OsClose, 0 },
ebf0: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
ec00: 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20 20 20 20  OsLock",        
ec10: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c   test_sqlite3OsL
ec20: 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ock, 0 },.     {
ec30: 20 22 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63   "sqlite3OsUnloc
ec40: 6b 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73  k",       test_s
ec50: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 2c 20  qlite3OsUnlock, 
ec60: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64  0 },.     { "add
ec70: 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  _test_collate", 
ec80: 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74       test_collat
ec90: 65 2c 20 30 20 20 20 20 20 20 20 20 20 7d 2c 0a  e, 0         },.
eca0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
ecb0: 63 72 61 73 68 73 65 65 64 22 2c 20 20 20 20 20  crashseed",     
ecc0: 73 71 6c 69 74 65 33 5f 63 72 61 73 68 73 65 65  sqlite3_crashsee
ecd0: 64 2c 20 30 20 20 20 20 20 20 20 20 20 7d 2c 0a  d, 0         },.
ece0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
ecf0: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
ed00: 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b 0a 0a 20  te3_os_trace;.. 
ed10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
ed20: 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28  of(aCmd)/sizeof(
ed30: 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aCmd[0]); i++){.
ed40: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f      Tcl_CreateCo
ed50: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43  mmand(interp, aC
ed60: 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d  md[i].zName, aCm
ed70: 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30  d[i].xProc, 0, 0
ed80: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
ed90: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43  ; i<sizeof(aObjC
eda0: 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43  md)/sizeof(aObjC
edb0: 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
edc0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
edd0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
ede0: 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ObjCmd[i].zName,
edf0: 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d   .        aObjCm
ee00: 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a  d[i].xProc, aObj
ee10: 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74  Cmd[i].clientDat
ee20: 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  a, 0);.  }.  Tcl
ee30: 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
ee40: 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f   "sqlite_search_
ee50: 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
ee60: 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
ee70: 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c  earch_count, TCL
ee80: 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
ee90: 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
eea0: 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72  , "sqlite_interr
eeb0: 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  upt_count", .   
eec0: 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
eed0: 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
eee0: 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
eef0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
ef00: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
ef10: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
ef20: 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
ef30: 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66  )&sqlite3_open_f
ef40: 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ile_count, TCL_L
ef50: 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
ef60: 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
ef70: 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f  "sqlite_current_
ef80: 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63  time", .      (c
ef90: 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75  har*)&sqlite3_cu
efa0: 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f  rrent_time, TCL_
efb0: 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
efc0: 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
efd0: 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63   "sqlite_os_trac
efe0: 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
eff0: 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61  )&sqlite3_os_tra
f000: 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
f010: 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
f020: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
f030: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
f040: 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
f050: 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
f060: 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
f070: 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
f080: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f090: 7d 0a                                            }.