/ Hex Artifact Content
Login

Artifact cd1284a7e62b2523cfee146a758a3c2416d25657:


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 32 20 32 30 30 34 2f 30 36 2f  ,v 1.82 2004/06/
0240: 32 32 20 31 32 3a 34 36 3a 35 34 20 64 72 68 20  22 12:46:54 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 73 74 72 20 46 4f 52 4d 41 54 20 49 4e  tf_str FORMAT IN
43f0: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53 54  TEGER INTEGER ST
4400: 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  RING.**.** Call 
4410: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f  mprintf with two
4420: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
4430: 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e  ts and one strin
4440: 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74  g argument.*/.st
4450: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
4460: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a 20 20  _mprintf_str(.  
4470: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4480: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4490: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
44a0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
44b0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
44c0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
44d0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
44e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
44f0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
4500: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4510: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4520: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4530: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33   */.){.  int a[3
4540: 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  ], i;.  char *z;
4550: 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20 7c 7c  .  if( argc<4 ||
4560: 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20 20 54   argc>5 ){.    T
4570: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4580: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4590: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
45a0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
45b0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
45c0: 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c  NT INT ?STRING?\
45d0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
45e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
45f0: 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34  }.  for(i=2; i<4
4600: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4610: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
4620: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
4630: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
4640: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
4650: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4660: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
4670: 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f  , a[1], argc>4 ?
4680: 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29   argv[4] : NULL)
4690: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
46a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
46b0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
46c0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
46d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
46e0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
46f0: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52  _mprintf_str FOR
4700: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
4710: 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a  GER DOUBLE.**.**
4720: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
4730: 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61  th two integer a
4740: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65  rguments and one
4750: 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74   double argument
4760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4770: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
4780: 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e  ouble(.  void *N
4790: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
47a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
47b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
47c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
47d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
47e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4800: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
4810: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
4820: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
4830: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
4840: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
4850: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
4860: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61   double r;.  cha
4870: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
4880: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
4890: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
48a0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
48b0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
48c0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
48d0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
48e0: 4e 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29  NT STRING\"", 0)
48f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4900: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
4910: 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=2; i<4; i++)
4920: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
4930: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
4940: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29  v[i], &a[i-2]) )
4950: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4960: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
4970: 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72  _GetDouble(inter
4980: 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 29 20  p, argv[4], &r) 
4990: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
49a0: 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  OR;.  z = sqlite
49b0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
49c0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72  ], a[0], a[1], r
49d0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
49e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
49f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
4a00: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
4a10: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
4a20: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
4a30: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 46 4f  3_mprintf_str FO
4a40: 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42  RMAT DOUBLE DOUB
4a50: 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  LE.**.** Call mp
4a60: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
4a70: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
4a80: 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65  ent which is the
4a90: 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a   product of the.
4aa0: 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  ** two arguments
4ab0: 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54   given above.  T
4ac0: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  his is used to g
4ad0: 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77  enerate overflow
4ae0: 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a   and underflow.*
4af0: 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73  * doubles to tes
4b00: 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  t that they are 
4b10: 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72  converted proper
4b20: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
4b30: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
4b40: 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f 69 64  f_scaled(.  void
4b50: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
4b60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4b70: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
4b80: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
4b90: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4ba0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4bb0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4bc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4bd0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4be0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4bf0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4c00: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4c10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 64 6f  ){.  int i;.  do
4c20: 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63 68 61  uble r[2];.  cha
4c30: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
4c40: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
4c50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4c60: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4c70: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4c80: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
4c90: 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c    " FORMAT DOUBL
4ca0: 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b  E DOUBLE\"", 0);
4cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4cc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
4cd0: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
4ce0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
4cf0: 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61  Double(interp, a
4d00: 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d 29  rgv[i], &r[i-2])
4d10: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4d20: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
4d30: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
4d40: 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31  rgv[1], r[0]*r[1
4d50: 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
4d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
4d70: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
4d80: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
4d90: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4da0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
4db0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20 4e 0a 2a  _malloc_fail N.*
4dc0: 2a 0a 2a 2a 20 52 69 67 20 73 71 6c 69 74 65 4d  *.** Rig sqliteM
4dd0: 61 6c 6c 6f 63 28 29 20 74 6f 20 66 61 69 6c 20  alloc() to fail 
4de0: 6f 6e 20 74 68 65 20 4e 2d 74 68 20 63 61 6c 6c  on the N-th call
4df0: 2e 20 20 54 75 72 6e 20 6f 66 66 20 74 68 69 73  .  Turn off this
4e00: 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 61 6e   mechanism.** an
4e10: 64 20 72 65 73 65 74 20 74 68 65 20 73 71 6c 69  d reset the sqli
4e20: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
4e30: 64 20 76 61 72 69 61 62 6c 65 20 69 73 20 4e 3d  d variable is N=
4e40: 3d 30 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  =0..*/.#ifdef SQ
4e50: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
4e60: 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61 6c  c int sqlite_mal
4e70: 6c 6f 63 5f 66 61 69 6c 28 0a 20 20 76 6f 69 64  loc_fail(.  void
4e80: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
4e90: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4ea0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
4eb0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
4ec0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4ed0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4ee0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4ef0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4f00: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4f10: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4f20: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4f30: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4f40: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66  ){.  int n;.  if
4f50: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
4f60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4f70: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
4f80: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
4f90: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
4fa0: 20 22 20 4e 5c 22 22 2c 20 30 29 3b 0a 20 20 20   " N\"", 0);.   
4fb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4fc0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
4fd0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
4fe0: 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29 20 72  argv[1], &n) ) r
4ff0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5000: 0a 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c  .  sqlite3_iMall
5010: 6f 63 46 61 69 6c 20 3d 20 6e 3b 0a 20 20 73 71  ocFail = n;.  sq
5020: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
5030: 6c 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  led = 0;.  retur
5040: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
5050: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
5060: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73   sqlite_malloc_s
5070: 74 61 74 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  tat.**.** Return
5080: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
5090: 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 73 71  rior calls to sq
50a0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
50b0: 20 73 71 6c 69 74 65 46 72 65 65 28 29 2e 0a 2a   sqliteFree()..*
50c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
50d0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
50e0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73   sqlite_malloc_s
50f0: 74 61 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  tat(.  void *Not
5100: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
5110: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
5120: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
5130: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
5140: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
5150: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
5160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5170: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
5180: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
5190: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
51a0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
51b0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
51c0: 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
51d0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
51e0: 22 25 64 20 25 64 20 25 64 22 2c 20 73 71 6c 69  "%d %d %d", sqli
51f0: 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2c 20 73 71 6c  te3_nMalloc, sql
5200: 69 74 65 33 5f 6e 46 72 65 65 2c 20 73 71 6c 69  ite3_nFree, sqli
5210: 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 29  te3_iMallocFail)
5220: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
5230: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
5240: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
5250: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
5260: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
5270: 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a  sqlite_abort.**.
5280: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
5290: 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74  process immediat
52a0: 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ely.  This is no
52b0: 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f  t a clean shutdo
52c0: 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  wn..** This comm
52d0: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74  and is used to t
52e0: 65 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61  est the recovera
52f0: 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61  bility of a data
5300: 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65  base in.** the e
5310: 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61  vent of a progra
5320: 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74  m crash..*/.stat
5330: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 61 62  ic int sqlite_ab
5340: 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ort(.  void *Not
5350: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
5360: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
5370: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
5380: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
5390: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
53a0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
53c0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
53d0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
53e0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
53f0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
5400: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
5410: 61 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d  assert( interp==
5420: 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77  0 );   /* This w
5430: 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
5440: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
5450: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
5460: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
5470: 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64 65 66  ne is a user-def
5480: 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f  ined SQL functio
5490: 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a  n whose purpose.
54a0: 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ** is to test th
54b0: 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73  e sqlite_set_res
54c0: 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74  ult() API..*/.st
54d0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 46 75  atic void testFu
54e0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
54f0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
5500: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
5510: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
5520: 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29  while( argc>=2 )
5530: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
5540: 20 2a 7a 41 72 67 30 20 3d 20 73 71 6c 69 74 65   *zArg0 = sqlite
5550: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5560: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[0]);.    if( z
5570: 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69 66  Arg0 ){.      if
5580: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
5590: 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74 22  Cmp(zArg0, "int"
55a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
55b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
55c0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
55d0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
55e0: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
55f0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
5600: 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74 36  ICmp(zArg0,"int6
5610: 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  4")==0 ){.      
5620: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5630: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
5640: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
5650: 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20  t64(argv[1]));. 
5660: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
5670: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
5680: 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30  rg0,"string")==0
5690: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
56a0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
56b0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
56c0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
56d0: 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20  [1]), -1,.      
56e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41        SQLITE_TRA
56f0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
5700: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
5710: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 64  StrICmp(zArg0,"d
5720: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
5730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5740: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
5750: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
5760: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 31  ue_double(argv[1
5770: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
5780: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5790: 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22  Cmp(zArg0,"null"
57a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
57b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
57c0: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
57d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
57e0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
57f0: 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20 29  g0,"value")==0 )
5800: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5810: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
5820: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71 6c  ontext, argv[sql
5830: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
5840: 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20  rgv[1])]);.     
5850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5860: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
5870: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5880: 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72  e{.      goto er
5890: 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ror_out;.    }. 
58a0: 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20     argc -= 2;.  
58b0: 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d    argv += 2;.  }
58c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f  .  return;..erro
58d0: 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
58e0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
58f0: 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61 72 67  ntext,"first arg
5900: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
5910: 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20  one of: ".      
5920: 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69 6e  "int int64 strin
5930: 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61  g double null va
5940: 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a  lue", -1);.}../*
5950: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
5960: 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73  ite_register_tes
5970: 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20 20  t_function  DB  
5980: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73  NAME.**.** Regis
5990: 74 65 72 20 74 68 65 20 74 65 73 74 20 53 51 4c  ter the test SQL
59a0: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65   function on the
59b0: 20 64 61 74 61 62 61 73 65 20 44 42 20 75 6e 64   database DB und
59c0: 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45  er the name NAME
59d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
59e0: 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75  test_register_fu
59f0: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
5a00: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
5a10: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
5a20: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
5a30: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
5a40: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
5a50: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
5a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5a70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
5a80: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
5a90: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
5aa0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
5ab0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
5ac0: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 69 6e 74  qlite *db;.  int
5ad0: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
5ae0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
5af0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5b00: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
5b10: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
5b20: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
5b30: 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d    " DB FUNCTION-
5b40: 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  NAME", 0);.    r
5b50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5b60: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
5b70: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
5b80: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
5b90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5ba0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5bb0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
5bc0: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31  (db, argv[2], -1
5bd0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
5be0: 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e  , .      testFun
5bf0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
5c00: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  rc!=0 ){.    Tcl
5c10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5c20: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
5c30: 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
5c40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5c50: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
5c60: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
5c70: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
5c80: 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20  _finalize  STMT 
5c90: 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  .**.** Finalize 
5ca0: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
5cb0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
5cc0: 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28  t test_finalize(
5cd0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
5ce0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
5cf0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
5d00: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
5d10: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
5d20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
5d30: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
5d40: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
5d50: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
5d60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5d70: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
5d80: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
5d90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
5da0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
5db0: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
5dc0: 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
5dd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5de0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
5df0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
5e00: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
5e10: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
5e20: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
5e30: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
5e40: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
5e50: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
5e60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
5e70: 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65  char *)errorName
5e80: 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
5e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
5ea0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
5eb0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ge:  sqlite3_res
5ec0: 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  et  STMT .**.** 
5ed0: 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65  Finalize a state
5ee0: 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  ment handle..*/.
5ef0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
5f00: 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20  reset(.  void * 
5f10: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
5f20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5f30: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
5f40: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
5f50: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
5f60: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
5f70: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
5f80: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
5f90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5fa0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5fb0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5fc0: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
5fd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
5fe0: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
5ff0: 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
6000: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6010: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
6020: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
6030: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
6040: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
6050: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
6060: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
6070: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6080: 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
6090: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
60a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
60b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
60c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
60d0: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
60e0: 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  s DB.**.** Retur
60f0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6100: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
6110: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20  the database by 
6120: 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20  the last SQL.** 
6130: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  execution..*/.st
6140: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68  atic int test_ch
6150: 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20  anges(.  void * 
6160: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
6170: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6180: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
6190: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
61a0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
61b0: 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62  e3 *db;.  if( ob
61c0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
61d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
61e0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
61f0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
6200: 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  "",.       Tcl_G
6210: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
6220: 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
6230: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6240: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
6250: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
6260: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
6270: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
6280: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6290: 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
62a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
62b0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
62c0: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29  ite3_changes(db)
62d0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
62e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
62f0: 69 73 20 69 73 20 74 68 65 20 22 73 74 61 74 69  is is the "stati
6300: 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68  c_bind_value" th
6310: 61 74 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  at variables are
6320: 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a   bound to when.*
6330: 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f  * the FLAG optio
6340: 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e  n of sqlite3_bin
6350: 64 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f  d is "static".*/
6360: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 71  .static char *sq
6370: 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
6380: 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 0a 2f 2a 0a  _value = 0;../*.
6390: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
63a0: 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58  e3_bind  VM  IDX
63b0: 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a    VALUE  FLAGS.*
63c0: 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61  *.** Sets the va
63d0: 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74  lue of the IDX-t
63e0: 68 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 22  h occurance of "
63f0: 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ?" in the origin
6400: 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67  al SQL.** string
6410: 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20  .  VALUE is the 
6420: 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46  new value.  If F
6430: 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65  LAGS=="null" the
6440: 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67  n VALUE is.** ig
6450: 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61  nored and the va
6460: 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  lue is set to NU
6470: 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  LL.  If FLAGS=="
6480: 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20  static" then.** 
6490: 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74  the value is set
64a0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
64b0: 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62   a static variab
64c0: 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c  le named.** "sql
64d0: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
64e0: 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47  value".  If FLAG
64f0: 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e  S=="normal" then
6500: 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68   a copy.** of th
6510: 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e  e VALUE is made.
6520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
6530: 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64  est_bind(.  void
6540: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
6550: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6560: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
6570: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
6580: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
6590: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
65a0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
65b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
65c0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
65d0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
65e0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
65f0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
6600: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
6610: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
6620: 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
6630: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
6640: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6650: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
6660: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
6670: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
6680: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d  0], .       " VM
6690: 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c   IDX VALUE (null
66a0: 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c  |static|normal)\
66b0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
66c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
66d0: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
66e0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
66f0: 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20  rgv[1], &pStmt) 
6700: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6710: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
6720: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
6730: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
6740: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6750: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
6760: 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20  v[4],"null")==0 
6770: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
6780: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
6790: 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c  tmt, idx);.  }el
67a0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
67b0: 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d  gv[4],"static")=
67c0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
67d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
67e0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
67f0: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
6800: 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20  value, -1, 0);. 
6810: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
6820: 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61  p(argv[4],"norma
6830: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  l")==0 ){.    rc
6840: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
6850: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
6860: 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51   argv[3], -1, SQ
6870: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
6880: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
6890: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
68a0: 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75  nterp, "4th argu
68b0: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22  ment should be "
68c0: 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c  .        "\"null
68d0: 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22  \" or \"static\"
68e0: 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c   or \"normal\"",
68f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
6900: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
6910: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63   if( rc ){.    c
6920: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
6930: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
6940: 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
6950: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6960: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
6970: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
6980: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
6990: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
69a0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
69b0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
69c0: 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c  ge: add_test_col
69d0: 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c 75  late <db ptr> <u
69e0: 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
69f0: 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54  utf16be>.**.** T
6a00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6a10: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61  used to test tha
6a20: 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73  t SQLite selects
6a30: 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6c   the correct col
6a40: 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e  lation.** sequen
6a50: 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  ce callback when
6a60: 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
6a70: 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
6a80: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
6a90: 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
6aa0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
6ab0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
6ac0: 65 67 69 73 74 65 72 73 20 74 68 65 20 63 6f 6c  egisters the col
6ad0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
6ae0: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a  "test_collate".*
6af0: 2a 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  * with database 
6b00: 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65  handle <db>. The
6b10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6b20: 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74 20   must be a list 
6b30: 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c  of three.** bool
6b40: 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20 74  ean values. If t
6b50: 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75 65  he first is true
6b60: 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e  , then a version
6b70: 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   of test_collate
6b80: 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72 65   is.** registere
6b90: 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20  d for UTF-8, if 
6ba0: 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72  the second is tr
6bb0: 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73  ue, a version is
6bc0: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 0a   registered for.
6bd0: 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  ** UTF-16le, if 
6be0: 74 68 65 20 74 68 69 72 64 20 69 73 20 74 72 75  the third is tru
6bf0: 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76 65  e, a UTF-16be ve
6c00: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
6c10: 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20  le..** Previous 
6c20: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73 74  versions of test
6c30: 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65 6c  _collate are del
6c40: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
6c50: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
6c60: 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  ce test_collate 
6c70: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
6c80: 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a  y calling the.**
6c90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73   following TCL s
6ca0: 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  cript:.**.**   "
6cb0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e  test_collate <en
6cc0: 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a  c> <lhs> <rhs>".
6cd0: 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20  **.** The <lhs> 
6ce0: 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74 68  and <rhs> are th
6cf0: 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65 69  e two values bei
6d00: 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63  ng compared, enc
6d10: 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  oded in UTF-8..*
6d20: 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72 61  * The <enc> para
6d30: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 6e 63  meter is the enc
6d40: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c  oding of the col
6d50: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
6d60: 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73  that.** SQLite s
6d70: 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e  elected to call.
6d80: 20 54 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   The TCL test sc
6d90: 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  ript implements 
6da0: 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c  the.** "test_col
6db0: 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a  late" proc..**.*
6dc0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
6dd0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20   will only work 
6de0: 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70 72 65  with one intepre
6df0: 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c 20 61  ter at a time, a
6e00: 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70 20  s the.** interp 
6e10: 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65 20 77  pointer to use w
6e20: 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67 20 74  hen evaluating t
6e30: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73  he TCL script is
6e40: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 54   stored in.** pT
6e50: 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
6e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
6e70: 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43 6f 6c  Interp* pTestCol
6e80: 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74 61 74  lateInterp;.stat
6e90: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c  ic int test_coll
6ea0: 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64  ate_func(.  void
6eb0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
6ec0: 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  A, const void *z
6ed0: 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e  A,.  int nB, con
6ee0: 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
6ef0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20 3d   Tcl_Interp *i =
6f00: 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
6f10: 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69 6e  erp;.  int encin
6f20: 20 3d 20 28 69 6e 74 29 70 43 74 78 3b 0a 20 20   = (int)pCtx;.  
6f30: 69 6e 74 20 72 65 73 3b 0a 0a 20 20 73 71 6c 69  int res;..  sqli
6f40: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
6f50: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
6f60: 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
6f70: 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63  tringObj("test_c
6f80: 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20  ollate", -1);.  
6f90: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
6fa0: 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  (pX);..  switch(
6fb0: 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61   encin ){.    ca
6fc0: 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a  se SQLITE_UTF8:.
6fd0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
6fe0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6ff0: 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
7000: 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29  gObj("UTF-8",-1)
7010: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7020: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7030: 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54  UTF16LE:.      T
7040: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7050: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
7060: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
7070: 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20  TF-16LE",-1));. 
7080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7090: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
70a0: 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  6BE:.      Tcl_L
70b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
70c0: 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
70d0: 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
70e0: 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  6BE",-1));.     
70f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
7100: 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
7110: 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 56 61  t(0);.  }..  pVa
7120: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
7130: 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  New();.  sqlite3
7140: 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
7150: 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c  , nA, zA, encin,
7160: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
7170: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
7180: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
7190: 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
71a0: 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  j(sqlite3_value_
71b0: 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 29 29 3b  text(pVal),-1));
71c0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
71d0: 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20  etStr(pVal, nB, 
71e0: 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54  zB, encin, SQLIT
71f0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 54 63 6c  E_STATIC);.  Tcl
7200: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7210: 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
7220: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
7230: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
7240: 56 61 6c 29 2c 2d 31 29 29 3b 0a 20 20 73 71 6c  Val),-1));.  sql
7250: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
7260: 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c  al);..  Tcl_Eval
7270: 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30 29 3b  ObjEx(i, pX, 0);
7280: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
7290: 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47  unt(pX);.  Tcl_G
72a0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20  etIntFromObj(i, 
72b0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
72c0: 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20 72 65  (i), &res);.  re
72d0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74  turn res;.}.stat
72e0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c  ic int test_coll
72f0: 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ate(.  void * cl
7300: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
7310: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
7320: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
7330: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
7340: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
7350: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b   *db;.  int val;
7360: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
7370: 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
7380: 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  .  pTestCollateI
7390: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
73a0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
73b0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
73c0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
73d0: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
73e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69   TCL_ERROR;..  i
73f0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
7400: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
7410: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
7420: 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
7430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
7440: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
7450: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  lation(db, "test
7460: 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
7470: 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20  E_UTF8, .       
7480: 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
7490: 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63  UTF8, val?test_c
74a0: 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
74b0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
74c0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
74d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
74e0: 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
74f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7500: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7510: 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74  collation(db, "t
7520: 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
7530: 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20  LITE_UTF16LE, . 
7540: 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53         (void *)S
7550: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76  QLITE_UTF16LE, v
7560: 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
7570: 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20 54  func:0);.  if( T
7580: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
7590: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
75a0: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
75b0: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
75c0: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
75d0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
75e0: 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c  on(db, "test_col
75f0: 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
7600: 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20  F16BE, .        
7610: 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
7620: 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74  TF16BE, val?test
7630: 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
7640: 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 54 43  ;.  .  return TC
7650: 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
7660: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
7670: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
7680: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
7690: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
76a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
76b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
76c0: 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20  , " <DB> <utf8> 
76d0: 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
76e0: 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75  be>", 0);.  retu
76f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
7700: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
7710: 74 65 33 5f 63 72 61 73 68 73 65 65 64 28 0a 20  te3_crashseed(. 
7720: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
7730: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
7740: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
7750: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
7760: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
7770: 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54 0a  .#ifdef OS_TEST.
7780: 20 20 69 6e 74 20 73 65 65 64 3b 0a 20 20 69 66    int seed;.  if
7790: 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f  ( objc!=2 ) goto
77a0: 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28   bad_args;.  if(
77b0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
77c0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
77d0: 32 5d 2c 20 26 73 65 65 64 29 20 29 20 72 65 74  2], &seed) ) ret
77e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
77f0: 20 73 71 6c 69 74 65 33 53 65 74 43 72 61 73 68   sqlite3SetCrash
7800: 73 65 65 64 28 73 65 65 64 29 3b 0a 23 65 6e 64  seed(seed);.#end
7810: 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
7820: 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 4f 53 5f 54  OK;..#ifdef OS_T
7830: 45 53 54 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  EST.bad_args:.  
7840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7850: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
7860: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
7870: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
7880: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
7890: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
78a0: 3c 73 65 65 64 3e 22 2c 20 30 29 3b 0a 20 20 72  <seed>", 0);.  r
78b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
78c0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
78d0: 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65 61  * Usage:    brea
78e0: 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69  kpoint.**.** Thi
78f0: 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73  s routine exists
7900: 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65   for one purpose
7910: 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20   - to provide a 
7920: 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a  place to put a.*
7930: 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74  * breakpoint wit
7940: 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20 62  h GDB that can b
7950: 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69 6e  e triggered usin
7960: 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65  g TCL code.  The
7970: 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73   use.** for this
7980: 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74 69   is when a parti
7990: 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73  cular test fails
79a0: 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31 34   on (say) the 14
79b0: 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a  85th iteration..
79c0: 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65  ** In the TCL te
79d0: 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63 61  st script, we ca
79e0: 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20  n add code like 
79f0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
7a00: 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72  if {$i==1485} br
7a10: 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
7a20: 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74  hen run testfixt
7a30: 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75 67  ure in the debug
7a40: 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72  ger and wait for
7a50: 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20   the breakpoint 
7a60: 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65  to.** fire.  The
7a70: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65  n additional bre
7a80: 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20  akpoints can be 
7a90: 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77  set to trace dow
7aa0: 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74  n the bug..*/.st
7ab0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 72  atic int test_br
7ac0: 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64  eakpoint(.  void
7ad0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
7ae0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7af0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
7b00: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
7b10: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
7b20: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
7b30: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
7b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
7b50: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
7b60: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
7b70: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
7b80: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
7b90: 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ){.  return TCL_
7ba0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  OK;         /* D
7bb0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a  o nothing */.}..
7bc0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
7bd0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
7be0: 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a   STMT N VALUE.**
7bf0: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
7c00: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e  ite3_bind_int in
7c10: 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
7c20: 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
7c30: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
7c40: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
7c50: 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
7c60: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
7c70: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
7c80: 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62  .** binds a 32-b
7c90: 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
7ca0: 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
7cb0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
7cc0: 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a   test_bind_int(.
7cd0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
7ce0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
7cf0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
7d00: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
7d10: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
7d20: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
7d30: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
7d40: 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b  dx;.  int value;
7d50: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
7d60: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
7d70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7d80: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
7d90: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
7da0: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
7db0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7dc0: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
7dd0: 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
7de0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
7df0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7e00: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
7e10: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
7e20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
7e30: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
7e40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7e50: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
7e60: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
7e70: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
7e80: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7e90: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
7ea0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
7eb0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
7ec0: 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20  value) ) return 
7ed0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
7ee0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
7ef0: 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  int(pStmt, idx, 
7f00: 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 72 63  value);.  if( rc
7f10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7f20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7f30: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
7f40: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
7f50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
7f60: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
7f70: 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
7f80: 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
7f90: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
7fa0: 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
7fb0: 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
7fc0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
7fd0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
7fe0: 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
7ff0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
8000: 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
8010: 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36  and.** binds a 6
8020: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41  4-bit integer VA
8030: 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64  LUE to that wild
8040: 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
8050: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e  int test_bind_in
8060: 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
8070: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
8080: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
8090: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
80a0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
80b0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
80c0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
80d0: 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20 76  int idx;.  i64 v
80e0: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
80f0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
8100: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8110: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8120: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8130: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
8140: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
8150: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
8160: 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
8170: 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
8180: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8190: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
81a0: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
81b0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
81c0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
81d0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) 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 32 5d 2c  interp, objv[2],
8210: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
8220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
8230: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
8240: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
8250: 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
8260: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8270: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
8280: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
8290: 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
82a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
82b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
82c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
82d0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
82e0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
82f0: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
8300: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54  _bind_double  ST
8310: 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
8320: 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
8330: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e  3_bind_double in
8340: 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
8350: 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
8360: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
8370: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
8380: 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
8390: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
83a0: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
83b0: 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62  .** binds a 64-b
83c0: 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
83d0: 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
83e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
83f0: 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c   test_bind_doubl
8400: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
8410: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
8420: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
8430: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
8440: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
8450: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
8460: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
8470: 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20  t idx;.  double 
8480: 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
8490: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
84a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
84b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
84c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
84d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
84e0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
84f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8500: 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
8510: 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
8520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8530: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
8540: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
8550: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
8560: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
8570: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
8580: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
8590: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
85a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
85b0: 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
85c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
85d0: 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46  ( Tcl_GetDoubleF
85e0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
85f0: 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
8600: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8610: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
8620: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
8630: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
8640: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
8650: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
8660: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8670: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
8680: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
8690: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
86a0: 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54  _bind_null  STMT
86b0: 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
86c0: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  e sqlite3_bind_n
86d0: 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ull interface.  
86e0: 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
86f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
8700: 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
8710: 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
8720: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
8730: 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
8740: 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
8750: 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69  a NULL to the wi
8760: 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
8770: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
8780: 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  null(.  void * c
8790: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
87a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
87b0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
87c0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
87d0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
87e0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
87f0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
8800: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
8810: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
8820: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8830: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
8840: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
8850: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
8860: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8870: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
8880: 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T N", 0);.    re
8890: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
88a0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
88b0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
88c0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
88d0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
88e0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
88f0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
8900: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
8910: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
8920: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
8930: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
8940: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
8950: 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
8960: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8970: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
8980: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8990: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
89a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
89b0: 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
89c0: 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e 20 53  d_text  STMT N S
89d0: 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
89e0: 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
89f0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69 6e 74  e3_bind_text int
8a00: 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
8a10: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
8a20: 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
8a30: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
8a40: 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
8a50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8a60: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
8a70: 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 38  ** binds a UTF-8
8a80: 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
8a90: 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
8aa0: 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
8ab0: 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
8ac0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
8ad0: 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74  t test_bind_text
8ae0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
8af0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
8b00: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
8b10: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
8b20: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
8b30: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
8b40: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
8b50: 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65   idx;.  int byte
8b60: 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65  s;.  char *value
8b70: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
8b80: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
8b90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8ba0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8bb0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8bc0: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
8bd0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8be0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
8bf0: 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
8c00: 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  E BYTES", 0);.  
8c10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8c20: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
8c30: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
8c40: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
8c50: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
8c60: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
8c70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
8c80: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
8c90: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
8ca0: 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
8cb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76  n TCL_ERROR;.  v
8cc0: 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  alue = Tcl_GetSt
8cd0: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
8ce0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
8cf0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
8d00: 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20  bjv[4], &bytes) 
8d10: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8d20: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
8d30: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
8d40: 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c  tmt, idx, value,
8d50: 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54   bytes, SQLITE_T
8d60: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28  RANSIENT);.  if(
8d70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8d80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
8d90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
8da0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8db0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
8dc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
8dd0: 74 31 36 20 20 53 54 4d 54 20 4e 20 53 54 52 49  t16  STMT N STRI
8de0: 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54  NG BYTES.**.** T
8df0: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
8e00: 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74 65  bind_text16 inte
8e10: 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
8e20: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
8e30: 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
8e40: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
8e50: 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
8e60: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
8e70: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
8e80: 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31 36  * binds a UTF-16
8e90: 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
8ea0: 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
8eb0: 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
8ec0: 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
8ed0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
8ee0: 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74  t test_bind_text
8ef0: 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
8f00: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
8f10: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
8f20: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
8f30: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
8f40: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
8f50: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
8f60: 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
8f70: 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
8f80: 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
8f90: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
8fa0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8fb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8fc0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8fd0: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
8fe0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
8ff0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
9000: 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
9010: 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
9020: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9030: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
9040: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
9050: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
9060: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
9070: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
9080: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
9090: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
90a0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
90b0: 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
90c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90d0: 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74   value = Tcl_Get
90e0: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
90f0: 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
9100: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
9110: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
9120: 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
9130: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9140: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
9150: 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70  e3_bind_text16(p
9160: 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69 64  Stmt, idx, (void
9170: 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73 2c   *)value, bytes,
9180: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9190: 54 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  T);.  if( rc!=SQ
91a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
91b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
91c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
91d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
91e0: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
91f0: 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 53 54 4d 54  _bind_blob  STMT
9200: 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a   N DATA BYTES.**
9210: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
9220: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69  ite3_bind_blob i
9230: 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
9240: 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
9250: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
9260: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
9270: 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
9280: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
9290: 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
92a0: 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f  d.** binds a BLO
92b0: 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
92c0: 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20  d.  The BLOB is 
92d0: 42 59 54 45 53 20 62 79 74 65 73 20 69 6e 20 73  BYTES bytes in s
92e0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
92f0: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f  nt test_bind_blo
9300: 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  b(.  void * clie
9310: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
9320: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
9330: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
9340: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
9350: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
9360: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
9370: 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
9380: 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
9390: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
93a0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
93b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
93c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
93d0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
93e0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
93f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
9400: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
9410: 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54  0), " STMT N DAT
9420: 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  A BYTES", 0);.  
9430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9440: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
9450: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
9460: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
9470: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
9480: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
9490: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
94a0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
94b0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
94c0: 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
94d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76  n TCL_ERROR;.  v
94e0: 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  alue = Tcl_GetSt
94f0: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
9500: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
9510: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
9520: 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20  bjv[4], &bytes) 
9530: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9540: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
9550: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
9560: 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c  tmt, idx, value,
9570: 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54   bytes, SQLITE_T
9580: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28  RANSIENT);.  if(
9590: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
95a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
95b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
95c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
95d0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
95e0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42  lite3_errcode DB
95f0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
9600: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
9610: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
9620: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
9630: 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f  e3_* API.** erro
9640: 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51  r code. e.g. "SQ
9650: 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a  LITE_ERROR"..*/.
9660: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
9670: 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20  errcode(.  void 
9680: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
9690: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
96a0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
96b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
96c0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
96d0: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
96e0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
96f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9700: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9710: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9720: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
9730: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
9740: 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
9750: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9760: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
9770: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
9780: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9790: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
97a0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
97b0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
97c0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
97d0: 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d  (char *)errorNam
97e0: 65 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  e(sqlite3_errcod
97f0: 65 28 64 62 29 29 2c 20 30 29 3b 0a 20 20 72 65  e(db)), 0);.  re
9800: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9810: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74  /*.** Usage:   t
9820: 65 73 74 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a  est_errmsg DB.**
9830: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
9840: 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61  UTF-8 representa
9850: 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f  tion of the erro
9860: 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
9870: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74   for the.** most
9880: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
9890: 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  * API call..*/.s
98a0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
98b0: 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20  rrmsg(.  void * 
98c0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
98d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
98e0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
98f0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
9900: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
9910: 65 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e *db;.  const c
9920: 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66  har *zErr;..  if
9930: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
9940: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9950: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
9960: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
9970: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
9980: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
9990: 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
99a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
99b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
99c0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
99d0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
99e0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
99f0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
9a00: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72  L_ERROR;..  zErr
9a10: 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   = sqlite3_errms
9a20: 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  g(db);.  Tcl_Set
9a30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9a40: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
9a50: 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20  bj(zErr, -1));. 
9a60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
9a80: 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20    test_errmsg16 
9a90: 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
9aa0: 20 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72   the UTF-16 repr
9ab0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9ac0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
9ad0: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a  string for the.*
9ae0: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  * most recent sq
9af0: 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c  lite3_* API call
9b00: 2e 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65  . This is a byte
9b10: 20 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74   array object at
9b20: 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76   the TCL .** lev
9b30: 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75  el, and it inclu
9b40: 64 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30  des the 0x00 0x0
9b50: 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  0 terminator byt
9b60: 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  es at the end of
9b70: 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73   the.** UTF-16 s
9b80: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
9b90: 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67   int test_errmsg
9ba0: 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
9bb0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
9bc0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
9bd0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
9be0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
9bf0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  [].){.  sqlite *
9c00: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
9c10: 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 62 79   *zErr;.  int by
9c20: 74 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tes;..  if( objc
9c30: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
9c40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9c50: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9c60: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9c70: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
9c80: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
9c90: 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
9ca0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9cb0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
9cc0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
9cd0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
9ce0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
9cf0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9d00: 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  R;..  zErr = sql
9d10: 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62  ite3_errmsg16(db
9d20: 29 3b 0a 20 20 62 79 74 65 73 20 3d 20 73 71 6c  );.  bytes = sql
9d30: 69 74 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e  ite3utf16ByteLen
9d40: 28 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 54 63  (zErr, -1);.  Tc
9d50: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
9d60: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
9d70: 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c  teArrayObj(zErr,
9d80: 20 62 79 74 65 73 29 29 3b 0a 20 20 72 65 74 75   bytes));.  retu
9d90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9da0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
9db0: 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
9dc0: 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
9dd0: 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
9de0: 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
9df0: 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
9e00: 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
9e10: 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
9e20: 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
9e30: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
9e40: 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
9e50: 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
9e60: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
9e70: 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
9e80: 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
9e90: 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
9ea0: 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
9eb0: 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
9ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
9ed0: 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76  est_prepare(.  v
9ee0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
9ef0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
9f00: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
9f10: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
9f20: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
9f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
9f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
9f50: 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
9f60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
9f70: 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
9f80: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
9f90: 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
9fa0: 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
9fb0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
9fc0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9fd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9fe0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9ff0: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
a000: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
a010: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
a020: 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
a030: 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
a040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a050: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
a060: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
a070: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
a080: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
a090: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a0a0: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
a0b0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
a0c0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
a0d0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a0e0: 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
a0f0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
a100: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
a110: 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
a120: 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
a130: 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
a140: 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
a150: 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
a160: 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62  .      bytes = b
a170: 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53  ytes - (zTail-zS
a180: 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ql);.    }.    T
a190: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
a1a0: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
a1b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
a1c0: 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29  bj(zTail, bytes)
a1d0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
a1e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a1f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
a200: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72  mt==0 );.    spr
a210: 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29  intf(zBuf, "(%d)
a220: 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
a230: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a240: 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
a250: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
a260: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a270: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
a280: 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
a290: 20 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65    if( makePointe
a2a0: 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
a2b0: 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
a2c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a2d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a2e0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
a2f0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
a300: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a310: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
a320: 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c  3_prepare DB sql
a330: 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a   bytes tailvar.*
a340: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
a350: 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
a360: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
a370: 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
a380: 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
a390: 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
a3a0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
a3b0: 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
a3c0: 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
a3d0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
a3e0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
a3f0: 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
a400: 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
a410: 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
a420: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
a430: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
a440: 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20  st_prepare16(.  
a450: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
a460: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
a470: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
a480: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
a490: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
a4a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
a4b0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
a4c0: 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
a4d0: 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
a4e0: 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
a4f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
a500: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
a510: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
a520: 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20  int bytes;      
a530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a540: 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69   integer specifi
a550: 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20  ed as arg 3 */. 
a560: 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20   int objlen;    
a570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a580: 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e  e byte-array len
a590: 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a  gth of arg 2 */.
a5a0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
a5b0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
a5c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a5d0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
a5e0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
a5f0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
a600: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
a610: 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
a620: 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
a630: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a640: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
a650: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
a660: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
a670: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
a680: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a690: 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
a6a0: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
a6b0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65  (objv[2], &objle
a6c0: 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  n);.  if( Tcl_Ge
a6d0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
a6e0: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
a6f0: 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
a700: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
a710: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
a720: 65 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c  e3_prepare16(db,
a730: 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
a740: 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 20 29 7b  Stmt, &zTail) ){
a750: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a760: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
a770: 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f  ( zTail ){.    o
a780: 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d  bjlen = objlen -
a790: 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75   ((u8 *)zTail-(u
a7a0: 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  8 *)zSql);.  }el
a7b0: 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  se{.    objlen =
a7c0: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20   0;.  }.  pTail 
a7d0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
a7e0: 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69  ayObj((u8 *)zTai
a7f0: 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63  l, objlen);.  Tc
a800: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
a810: 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  Tail);.  Tcl_Obj
a820: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
a830: 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69  objv[4], 0, pTai
a840: 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  l, 0);.  Tcl_Dec
a850: 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
a860: 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  ;..  if( pStmt )
a870: 7b 0a 20 20 20 20 69 66 28 20 6d 61 6b 65 50 6f  {.    if( makePo
a880: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
a890: 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
a8a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a8b0: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
a8c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a8d0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
a8e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a8f0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
a900: 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d  te3_open filenam
a910: 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f  e ?options-list?
a920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
a930: 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64  est_open(.  void
a940: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
a950: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
a960: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
a970: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
a980: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
a990: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
a9a0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
a9b0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
a9c0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
a9d0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
a9e0: 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  & objc!=2 ){.   
a9f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
aa00: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
aa10: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
aa20: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
aa30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
aa40: 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
aa50: 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22  me options-list"
aa60: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
aa70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
aa80: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
aa90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
aaa0: 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  v[1]);.  rc = sq
aab0: 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65  lite3_open(zFile
aac0: 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20  name, &db);.  . 
aad0: 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72   if( makePointer
aae0: 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
aaf0: 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54  , db) ) return T
ab00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
ab10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ab20: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
ab30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ab40: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
ab50: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66  sqlite3_open16 f
ab60: 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a  ilename options.
ab70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
ab80: 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69  st_open16(.  voi
ab90: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
aba0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
abb0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
abc0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
abd0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
abe0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
abf0: 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  name;.  sqlite3 
ac00: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
ac10: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
ac20: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
ac30: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
ac40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ac50: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
ac60: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
ac70: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
ac80: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
ac90: 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73  filename options
aca0: 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  -list", 0);.    
acb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
acc0: 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61  ;.  }..  zFilena
acd0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  me = Tcl_GetByte
ace0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
acf0: 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63 20 3d  v[1], 0);.  rc =
ad00: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
ad10: 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b  zFilename, &db);
ad20: 0a 20 20 0a 20 20 69 66 28 20 6d 61 6b 65 50 6f  .  .  if( makePo
ad30: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
ad40: 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
ad50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ad60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ad70: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
ad80: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
ad90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
ada0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65  age: sqlite3_ste
adb0: 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76  p STMT.**.** Adv
adc0: 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d 65  ance the stateme
add0: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  nt to the next r
ade0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
adf0: 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76  t test_step(.  v
ae00: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
ae10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
ae20: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
ae30: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
ae40: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
ae50: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
ae60: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
ae70: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
ae80: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
ae90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
aea0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
aeb0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
aec0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
aed0: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
aee0: 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
aef0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
af00: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
af10: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
af20: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
af30: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
af40: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
af50: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
af60: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
af70: 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d  ;..  /* if( rc!=
af80: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72  SQLITE_DONE && r
af90: 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c!=SQLITE_ROW ) 
afa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
afb0: 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65  ; */.  Tcl_SetRe
afc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
afd0: 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72  ar *)errorName(r
afe0: 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
aff0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
b000: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
b010: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54  _column_count ST
b020: 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
b030: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
b040: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
b050: 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
b060: 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
b070: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
b080: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  lumn_count(.  vo
b090: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
b0a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b0b0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
b0c0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
b0d0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
b0e0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
b0f0: 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
b100: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
b110: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b120: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
b130: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
b140: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
b150: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
b160: 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
b170: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
b180: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b190: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
b1a0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
b1b0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b1c0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
b1d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b1e0: 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
b1f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
b200: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
b210: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
b220: 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
b230: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
b240: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
b250: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  te3_column_type 
b260: 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
b270: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70  * Return the typ
b280: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e  e of the data in
b290: 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
b2a0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
b2b0: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
b2c0: 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74  nt test_column_t
b2d0: 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ype(.  void * cl
b2e0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
b2f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
b300: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
b310: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b320: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
b330: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
b340: 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74  int col;.  int t
b350: 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  p;..  if( objc!=
b360: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
b370: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b380: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
b390: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
b3a0: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
b3b0: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
b3c0: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
b3d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
b3e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b3f0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
b400: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
b410: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
b420: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
b430: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b440: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
b450: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b460: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
b470: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b480: 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74  R;..  tp = sqlit
b490: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
b4a0: 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77  Stmt, col);.  sw
b4b0: 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20  itch( tp ){.    
b4c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
b4d0: 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f  GER: .      Tcl_
b4e0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b4f0: 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c  , "INTEGER", TCL
b500: 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
b510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b520: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20   SQLITE_NULL:.  
b530: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
b540: 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22  t(interp, "NULL"
b550: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
b560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b570: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
b580: 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  AT:.      Tcl_Se
b590: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
b5a0: 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41  "FLOAT", TCL_STA
b5b0: 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
b5c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
b5d0: 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  ITE_TEXT:.      
b5e0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
b5f0: 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43  terp, "TEXT", TC
b600: 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
b610: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b620: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
b630: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
b640: 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42  lt(interp, "BLOB
b650: 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
b660: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b670: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
b680: 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a   assert(0);.  }.
b690: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b6a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
b6b0: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
b6c0: 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75  _int64 STMT colu
b6d0: 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
b6e0: 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
b6f0: 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
b700: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
b710: 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64  ast as an.** wid
b720: 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67  e (64-bit) integ
b730: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
b740: 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e  t test_column_in
b750: 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
b760: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
b770: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
b780: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
b790: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b7a0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
b7b0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
b7c0: 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69  int col;.  i64 i
b7d0: 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
b7e0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
b7f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b800: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
b810: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
b820: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
b830: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
b840: 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
b850: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
b860: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b870: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
b880: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
b890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b8a0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
b8b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b8c0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
b8d0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
b8e0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
b8f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b900: 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73  ROR;..  iVal = s
b910: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
b920: 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  t64(pStmt, col);
b930: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
b940: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b950: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56  NewWideIntObj(iV
b960: 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
b970: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b980: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
b990: 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20  olumn_blob STMT 
b9a0: 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
b9b0: 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
b9c0: 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
b9d0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
b9e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b9f0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
ba00: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
ba10: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
ba20: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
ba30: 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e    int col;..  in
ba40: 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76  t len;.  const v
ba50: 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69  oid *pBlob;..  i
ba60: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
ba70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ba80: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
ba90: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
baa0: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
bab0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
bac0: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
bad0: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
bae0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
baf0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
bb00: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
bb10: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
bb20: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
bb30: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
bb40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
bb50: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
bb60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
bb70: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
bb80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70   TCL_ERROR;..  p
bb90: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
bba0: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
bbb0: 2c 20 63 6f 6c 29 3b 0a 20 20 6c 65 6e 20 3d 20  , col);.  len = 
bbc0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
bbd0: 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29  ytes(pStmt, col)
bbe0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
bbf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
bc00: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
bc10: 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20  (pBlob, len));. 
bc20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
bc30: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
bc40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
bc50: 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ouble STMT colum
bc60: 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
bc70: 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
bc80: 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
bc90: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
bca0: 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a  st as a double..
bcb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
bcc0: 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
bcd0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
bce0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
bcf0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
bd00: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
bd10: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
bd20: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
bd30: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
bd40: 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72   col;.  double r
bd50: 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
bd60: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
bd70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
bd80: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
bd90: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
bda0: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
bdb0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
bdc0: 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
bdd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
bde0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
bdf0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
be00: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
be10: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
be20: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
be30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
be40: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
be50: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
be60: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
be70: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
be80: 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73  ROR;..  rVal = s
be90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
bea0: 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  uble(pStmt, col)
beb0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
bec0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
bed0: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56  _NewDoubleObj(rV
bee0: 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
bef0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
bf00: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64  Usage: sqlite3_d
bf10: 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a  ata_count STMT .
bf20: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
bf30: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
bf40: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ns returned by t
bf50: 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
bf60: 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
bf70: 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63   int test_data_c
bf80: 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  ount(.  void * c
bf90: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
bfa0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
bfb0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
bfc0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bfd0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
bfe0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
bff0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
c000: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
c010: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
c020: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
c030: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
c040: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
c050: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
c060: 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
c070: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c080: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
c090: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
c0a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
c0b0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
c0c0: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
c0d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
c0e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
c0f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
c100: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61  ntObj(sqlite3_da
c110: 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29  ta_count(pStmt))
c120: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
c130: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
c140: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
c150: 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
c160: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
c170: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c180: 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
c190: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
c1a0: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
c1b0: 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
c1c0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
c1d0: 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a  test_stmt_utf8(.
c1e0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
c1f0: 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ata,        /* P
c200: 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
c210: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
c220: 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   be invoke */.  
c230: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c240: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
c250: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
c260: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
c270: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
c280: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63  ;.  int col;.  c
c290: 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75  onst char *(*xFu
c2a0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
c2b0: 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74  *, int) = client
c2c0: 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Data;.  const ch
c2d0: 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 69 66 28  ar *zRet;..  if(
c2e0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
c2f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c300: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
c310: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
c320: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
c330: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
c340: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
c350: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
c360: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c370: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
c380: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
c390: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
c3a0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
c3b0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
c3c0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
c3d0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
c3e0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
c3f0: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
c400: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74  CL_ERROR;.  zRet
c410: 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
c420: 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  col);.  if( zRet
c430: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
c440: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c450: 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a  har *)zRet, 0);.
c460: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
c470: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
c480: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
c490: 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f  umn_text STMT co
c4a0: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
c4b0: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
c4c0: 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63  _decltype STMT c
c4d0: 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
c4e0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
c4f0: 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75  n_name STMT colu
c500: 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
c510: 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
c520: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
c530: 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f  tData,     /* Po
c540: 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
c550: 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
c560: 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  be invoked */.  
c570: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c580: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
c590: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
c5a0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
c5b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
c5c0: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54  ;.  int col;.  T
c5d0: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20  cl_Obj *pRet;.  
c5e0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
c5f0: 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  e16;.  const voi
c600: 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  d *(*xFunc)(sqli
c610: 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20  te3_stmt*, int) 
c620: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  = clientData;.. 
c630: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
c640: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c650: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
c660: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
c670: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
c680: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
c690: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
c6a0: 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
c6b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c6c0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
c6d0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
c6e0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
c6f0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
c700: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
c710: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
c720: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
c730: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
c740: 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
c750: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
c760: 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63   zName16 = xFunc
c770: 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
c780: 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20  if( zName16 ){. 
c790: 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
c7a0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e  wByteArrayObj(zN
c7b0: 61 6d 65 31 36 2c 20 73 71 6c 69 74 65 33 75 74  ame16, sqlite3ut
c7c0: 66 31 36 42 79 74 65 4c 65 6e 28 7a 4e 61 6d 65  f16ByteLen(zName
c7d0: 31 36 2c 20 2d 31 29 2b 32 29 3b 0a 20 20 20 20  16, -1)+2);.    
c7e0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
c7f0: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
c800: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
c810: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
c820: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
c830: 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f  lumn_int STMT co
c840: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
c850: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
c860: 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75  _bytes STMT colu
c870: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
c880: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
c890: 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75  ytes16 STMT colu
c8a0: 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  mn.**.*/.static 
c8b0: 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e  int test_stmt_in
c8c0: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
c8d0: 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f  ntData,    /* Po
c8e0: 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
c8f0: 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
c900: 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  be invoked */.  
c910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c920: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
c930: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
c940: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
c950: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
c960: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69  ;.  int col;.  i
c970: 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  nt (*xFunc)(sqli
c980: 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20  te3_stmt*, int) 
c990: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  = clientData;.. 
c9a0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
c9b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c9c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
c9d0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
c9e0: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
c9f0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
ca00: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
ca10: 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
ca20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ca30: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ca40: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
ca50: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
ca60: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
ca70: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
ca80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
ca90: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
caa0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
cab0: 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
cac0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
cad0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
cae0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
caf0: 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53  wIntObj(xFunc(pS
cb00: 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72  tmt, col)));.  r
cb10: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
cb20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
cb30: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
cb40: 57 72 69 74 65 20 3c 66 69 6c 65 6e 61 6d 65 3e  Write <filename>
cb50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
cb60: 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70 65  est_sqlite3OsOpe
cb70: 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 76 6f  nReadWrite(.  vo
cb80: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
cb90: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cba0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
cbb0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
cbc0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
cbd0: 4f 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a  OsFile * pFile;.
cbe0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
cbf0: 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a 42  dummy;.  char zB
cc00: 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
cc10: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
cc20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
cc30: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
cc40: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
cc50: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
cc60: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cc70: 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
cc80: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
cc90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cca0: 0a 0a 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69  ..  pFile = sqli
ccb0: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
ccc0: 4f 73 46 69 6c 65 29 29 3b 0a 20 20 72 63 20 3d  OsFile));.  rc =
ccd0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
cce0: 61 64 57 72 69 74 65 28 54 63 6c 5f 47 65 74 53  adWrite(Tcl_GetS
ccf0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
cd00: 70 46 69 6c 65 2c 20 26 64 75 6d 6d 79 29 3b 0a  pFile, &dummy);.
cd10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cd20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
cd30: 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20  eFree(pFile);.  
cd40: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
cd50: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
cd60: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  errorName(rc), T
cd70: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
cd80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cd90: 3b 0a 20 20 7d 0a 20 20 6d 61 6b 65 50 6f 69 6e  ;.  }.  makePoin
cda0: 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
cdb0: 42 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 54  Buf, pFile);.  T
cdc0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
cdd0: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
cde0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
cdf0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  R;.}../*.** Usag
ce00: 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  e:  sqlite3OsClo
ce10: 73 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e  se <file handle>
ce20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
ce30: 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f  est_sqlite3OsClo
ce40: 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  se(.  void * cli
ce50: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
ce60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
ce70: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
ce80: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
ce90: 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a  [].){.  OsFile *
cea0: 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63   pFile;.  int rc
ceb0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
cec0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ced0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cee0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
cef0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
cf00: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
cf10: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
cf20: 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29   filehandle", 0)
cf30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
cf40: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
cf50: 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65  f( getFilePointe
cf60: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
cf70: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
cf80: 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  , &pFile) ){.   
cf90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
cfa0: 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
cfb0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 46 69  lite3OsClose(pFi
cfc0: 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  le);.  if( rc!=S
cfd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cfe0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
cff0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72  terp, (char *)er
d000: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
d010: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
d020: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d030: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
d040: 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72  (pFile);.  retur
d050: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d060: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
d070: 65 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65 20 68  e3OsLock <file h
d080: 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79 70 65  andle> <locktype
d090: 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
d0a0: 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c 6f  test_sqlite3OsLo
d0b0: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ck(.  void * cli
d0c0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d0d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d0e0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d0f0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d100: 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a  [].){.  OsFile *
d110: 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63   pFile;.  int rc
d120: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
d130: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
d140: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d150: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
d160: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
d170: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
d180: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
d190: 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c 65 68  .        " fileh
d1a0: 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c 52 45  andle (SHARED|RE
d1b0: 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c 45  SERVED|PENDING|E
d1c0: 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29 3b 0a  XCLUSIVE)", 0);.
d1d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d1e0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
d1f0: 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   getFilePointer(
d200: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
d210: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
d220: 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &pFile) ){.    r
d230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d240: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d 73  .  }..  if( 0==s
d250: 74 72 63 6d 70 28 22 53 48 41 52 45 44 22 2c 20  trcmp("SHARED", 
d260: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d270: 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72  jv[2])) ){.    r
d280: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
d290: 6b 28 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  k(pFile, SHARED_
d2a0: 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73  LOCK);.  }.  els
d2b0: 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28  e if( 0==strcmp(
d2c0: 22 52 45 53 45 52 56 45 44 22 2c 20 54 63 6c 5f  "RESERVED", Tcl_
d2d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
d2e0: 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ])) ){.    rc = 
d2f0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46  sqlite3OsLock(pF
d300: 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ile, RESERVED_LO
d310: 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  CK);.  }.  else 
d320: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 50  if( 0==strcmp("P
d330: 45 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47 65 74  ENDING", Tcl_Get
d340: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
d350: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
d360: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65  ite3OsLock(pFile
d370: 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 3b  , PENDING_LOCK);
d380: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
d390: 30 3d 3d 73 74 72 63 6d 70 28 22 45 58 43 4c 55  0==strcmp("EXCLU
d3a0: 53 49 56 45 22 2c 20 54 63 6c 5f 47 65 74 53 74  SIVE", Tcl_GetSt
d3b0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29  ring(objv[2])) )
d3c0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
d3d0: 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  e3OsLock(pFile, 
d3e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
d3f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
d400: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d410: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
d420: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
d430: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54 63  \"", .        Tc
d440: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d450: 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22  [0]), .        "
d460: 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48 41   filehandle (SHA
d470: 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45 4e  RED|RESERVED|PEN
d480: 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29 22  DING|EXCLUSIVE)"
d490: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
d4a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d4b0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d4c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
d4d0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
d4e0: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
d4f0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
d500: 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
d510: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d520: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
d530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
d540: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
d550: 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a  k <file handle>.
d560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
d570: 73 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  st_sqlite3OsUnlo
d580: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ck(.  void * cli
d590: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d5a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d5b0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d5c0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d5d0: 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a  [].){.  OsFile *
d5e0: 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63   pFile;.  int rc
d5f0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
d600: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
d610: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d620: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
d630: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
d640: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
d650: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
d660: 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29   filehandle", 0)
d670: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d680: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
d690: 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65  f( getFilePointe
d6a0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
d6b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d6c0: 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  , &pFile) ){.   
d6d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d6e0: 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
d6f0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
d700: 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
d710: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d720: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
d730: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
d740: 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d  (char *)errorNam
d750: 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
d760: 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
d770: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d780: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
d790: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .../*.** Registe
d7a0: 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20  r commands with 
d7b0: 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
d7c0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69  ter..*/.int Sqli
d7d0: 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
d7e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
d7f0: 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  {.  extern int s
d800: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
d810: 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
d820: 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  t sqlite3_interr
d830: 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  upt_count;.  ext
d840: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
d850: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b  open_file_count;
d860: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
d870: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
d880: 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72  me;.  static str
d890: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
d8a0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
d8b0: 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  _CmdProc *xProc;
d8c0: 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a  .  } aCmd[] = {.
d8d0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
d8e0: 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20  mprintf_int",   
d8f0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
d900: 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
d910: 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a  rintf_int    },.
d920: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
d930: 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  mprintf_str",   
d940: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
d950: 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
d960: 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a  rintf_str    },.
d970: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
d980: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c  mprintf_double",
d990: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
d9a0: 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
d9b0: 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a  rintf_double },.
d9c0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
d9d0: 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c  mprintf_scaled",
d9e0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
d9f0: 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
da00: 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a  rintf_scaled },.
da10: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
da20: 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c  mprintf_z_test",
da30: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
da40: 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e  Proc*)test_mprin
da50: 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20  tf_z        },. 
da60: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
da70: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
da80: 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ",     (Tcl_CmdP
da90: 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72  roc*)test_last_r
daa0: 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20  owid       },.  
dab0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
dac0: 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  ec_printf",     
dad0: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
dae0: 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72  oc*)test_exec_pr
daf0: 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20  intf      },.   
db00: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74    { "sqlite3_get
db10: 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20  _table_printf", 
db20: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
db30: 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c  c*)test_get_tabl
db40: 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20 20 20 20  e_printf },.    
db50: 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73   { "sqlite3_clos
db60: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
db70: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
db80: 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c  *)sqlite_test_cl
db90: 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ose     },.     
dba0: 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
dbb0: 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
dbc0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
dbd0: 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e  )test_create_fun
dbe0: 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b  ction  },.     {
dbf0: 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
dc00: 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20 20  _aggregate",    
dc10: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
dc20: 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
dc30: 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20  egate },.     { 
dc40: 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72  "sqlite_register
dc50: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  _test_function",
dc60: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
dc70: 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e  est_register_fun
dc80: 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  c    },.     { "
dc90: 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20  sqlite_abort",  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
dcc0: 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20  lite_abort      
dcd0: 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51      },.#ifdef SQ
dce0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
dcf0: 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  { "sqlite_malloc
dd00: 5f 66 61 69 6c 22 2c 20 20 20 20 20 20 20 20 20  _fail",         
dd10: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
dd20: 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66  )sqlite_malloc_f
dd30: 61 69 6c 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ail    },.     {
dd40: 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f   "sqlite_malloc_
dd50: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 20  stat",          
dd60: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
dd70: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74  sqlite_malloc_st
dd80: 61 74 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  at    },.#endif.
dd90: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62       { "sqlite_b
dda0: 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  ind",           
ddb0: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
ddc0: 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64  dProc*)test_bind
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
dde0: 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f 69       { "breakpoi
ddf0: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
de00: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
de10: 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61  dProc*)test_brea
de20: 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  kpoint       },.
de30: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74    };.  static st
de40: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
de50: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
de60: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50  l_ObjCmdProc *xP
de70: 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a  roc;.     void *
de80: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20  clientData;.  } 
de90: 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20  aObjCmd[] = {.  
dea0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
deb0: 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  nd_int",        
dec0: 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
ded0: 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20  int,      0 },. 
dee0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
def0: 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  ind_int64",     
df00: 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
df10: 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a  _int64,    0 },.
df20: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
df30: 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20  bind_double",   
df40: 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
df50: 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c  d_double,   0 },
df60: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
df70: 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20  _bind_null",    
df80: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
df90: 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d  nd_null     ,0 }
dfa0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
dfb0: 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20  3_bind_text",   
dfc0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
dfd0: 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20  ind_text     ,0 
dfe0: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
dff0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c  e3_bind_text16",
e000: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
e010: 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30  bind_text16   ,0
e020: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
e030: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20  te3_bind_blob", 
e040: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
e050: 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c  _bind_blob     ,
e060: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
e070: 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20 20  ite3_errcode",  
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
e090: 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20 20  t_errcode       
e0a0: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
e0b0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c 20 20  lite3_errmsg",  
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
e0d0: 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20 20 20  st_errmsg       
e0e0: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
e0f0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 22  qlite3_errmsg16"
e100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
e110: 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20 20 20  est_errmsg16    
e120: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
e130: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20 20  sqlite3_open",  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20 20 20  test_open       
e160: 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
e170: 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 22  "sqlite3_open16"
e180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e190: 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20 20 20   test_open16    
e1a0: 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20      ,0 },..     
e1b0: 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
e1c0: 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  re",            
e1d0: 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 20     test_prepare 
e1e0: 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
e1f0: 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
e200: 61 72 65 31 36 22 2c 20 20 20 20 20 20 20 20 20  are16",         
e210: 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
e220: 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  16     ,0 },.   
e230: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e    { "sqlite3_fin
e240: 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  alize",         
e250: 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69       test_finali
e260: 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ze      ,0 },.  
e270: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65     { "sqlite3_re
e280: 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  set",           
e290: 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65 74        test_reset
e2a0: 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
e2b0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
e2c0: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
e2d0: 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
e2e0: 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
e2f0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
e300: 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
e310: 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
e320: 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
e330: 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ..     /* sqlite
e340: 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49  3_column_*() API
e350: 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   */.     { "sqli
e360: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
e370: 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
e380: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c  _column_count  ,
e390: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
e3a0: 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22  ite3_data_count"
e3b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
e3c0: 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20  t_data_count    
e3d0: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
e3e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
e3f0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  e",           te
e400: 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20  st_column_type  
e410: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
e420: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
e430: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  ob",           t
e440: 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  est_column_blob 
e450: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
e460: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
e470: 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  ouble",         
e480: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
e490: 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  le ,0 },.     { 
e4a0: 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
e4b0: 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
e4c0: 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
e4d0: 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  64  ,0 },.     {
e4e0: 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
e4f0: 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 74 65  _int",        te
e500: 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 73  st_stmt_int,   s
e510: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e520: 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  t       },.     
e530: 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
e540: 6e 5f 62 79 74 65 73 22 2c 20 20 20 20 20 20 74  n_bytes",      t
e550: 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
e560: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
e570: 79 74 65 73 20 20 20 20 20 7d 2c 0a 20 20 20 20  ytes     },.    
e580: 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
e590: 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20 20 20  mn_bytes16",    
e5a0: 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
e5b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e5c0: 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20 20 20  bytes16   },.   
e5d0: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
e5e0: 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 20 20 20  umn_text",      
e5f0: 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
e600: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
e610: 5f 74 65 78 74 20 20 20 20 20 20 7d 2c 0a 20 20  _text      },.  
e620: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
e630: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 20  lumn_decltype", 
e640: 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
e650: 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ,  sqlite3_colum
e660: 6e 5f 64 65 63 6c 74 79 70 65 20 20 7d 2c 0a 20  n_decltype  },. 
e670: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
e680: 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 20  olumn_name",    
e690: 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
e6a0: 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  8,  sqlite3_colu
e6b0: 6d 6e 5f 6e 61 6d 65 20 20 20 20 20 20 7d 2c 0a  mn_name      },.
e6c0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
e6d0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20  column_text16", 
e6e0: 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74      test_stmt_ut
e6f0: 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  f16, sqlite3_col
e700: 75 6d 6e 5f 74 65 78 74 31 36 20 20 20 20 7d 2c  umn_text16    },
e710: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
e720: 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
e730: 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  16", test_stmt_u
e740: 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f  tf16, sqlite3_co
e750: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d  lumn_decltype16}
e760: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
e770: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22  3_column_name16"
e780: 2c 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  ,     test_stmt_
e790: 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63  utf16, sqlite3_c
e7a0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 20 20 20 20  olumn_name16    
e7b0: 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63  },..     /* Func
e7c0: 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20  tions from os.h 
e7d0: 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  */.     { "sqlit
e7e0: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
e7f0: 65 22 2c 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  e",test_sqlite3O
e800: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 2c 20  sOpenReadWrite, 
e810: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
e820: 69 74 65 33 4f 73 43 6c 6f 73 65 22 2c 20 20 20  ite3OsClose",   
e830: 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65       test_sqlite
e840: 33 4f 73 43 6c 6f 73 65 2c 20 30 20 7d 2c 0a 20  3OsClose, 0 },. 
e850: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73      { "sqlite3Os
e860: 4c 6f 63 6b 22 2c 20 20 20 20 20 20 20 20 20 74  Lock",         t
e870: 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63  est_sqlite3OsLoc
e880: 6b 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  k, 0 },.     { "
e890: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 22  sqlite3OsUnlock"
e8a0: 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c  ,       test_sql
e8b0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 2c 20 30 20  ite3OsUnlock, 0 
e8c0: 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  },.     { "add_t
e8d0: 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20  est_collate",   
e8e0: 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c     test_collate,
e8f0: 20 30 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20   0         },.  
e900: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
e910: 61 73 68 73 65 65 64 22 2c 20 20 20 20 20 73 71  ashseed",     sq
e920: 6c 69 74 65 33 5f 63 72 61 73 68 73 65 65 64 2c  lite3_crashseed,
e930: 20 30 20 20 20 20 20 20 20 20 20 7d 2c 0a 0a 20   0         },.. 
e940: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65   };.  int i;.  e
e950: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
e960: 33 5f 6f 73 5f 74 72 61 63 65 3b 0a 0a 20 20 66  3_os_trace;..  f
e970: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
e980: 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43  (aCmd)/sizeof(aC
e990: 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
e9a0: 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
e9b0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64  and(interp, aCmd
e9c0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b  [i].zName, aCmd[
e9d0: 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b  i].xProc, 0, 0);
e9e0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
e9f0: 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  i<sizeof(aObjCmd
ea00: 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  )/sizeof(aObjCmd
ea10: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
ea20: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
ea30: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62  mand(interp, aOb
ea40: 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a  jCmd[i].zName, .
ea50: 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b          aObjCmd[
ea60: 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d  i].xProc, aObjCm
ea70: 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c  d[i].clientData,
ea80: 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c   0);.  }.  Tcl_L
ea90: 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
eaa0: 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f  sqlite_search_co
eab0: 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
eac0: 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61  ar*)&sqlite3_sea
ead0: 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  rch_count, TCL_L
eae0: 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
eaf0: 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
eb00: 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70  "sqlite_interrup
eb10: 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  t_count", .     
eb20: 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
eb30: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
eb40: 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
eb50: 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
eb60: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
eb70: 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c  pen_file_count",
eb80: 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
eb90: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
eba0: 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
ebb0: 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
ebc0: 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
ebd0: 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69  qlite_current_ti
ebe0: 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  me", .      (cha
ebf0: 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75 72 72  r*)&sqlite3_curr
ec00: 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49  ent_time, TCL_LI
ec10: 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
ec20: 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
ec30: 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22  sqlite_os_trace"
ec40: 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
ec50: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65  sqlite3_os_trace
ec60: 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
ec70: 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
ec80: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
ec90: 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
eca0: 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
ecb0: 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  &sqlite_static_b
ecc0: 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f 4c  ind_value, TCL_L
ecd0: 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 72  INK_STRING);.  r
ece0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.