/ Hex Artifact Content
Login

Artifact fa01e3db097df48963e29cec66f2e080735767d4:


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 37 33 20 32 30 30 34 2f 30 36 2f  ,v 1.73 2004/06/
0240: 30 39 20 31 34 3a 30 31 3a 35 31 20 64 72 68 20  09 14:01:51 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 66 28 20 61  ite *db;.  if( a
2b30: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
2b40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2b50: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2b60: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2b70: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
2b80: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
2b90: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
2ba0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2bb0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2bc0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
2bd0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
2be0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2bf0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
2c00: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  b);.  return TCL
2c10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
2c20: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2c30: 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28 29  the x_coalesce()
2c40: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65   function..** Re
2c50: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 61  turn the first a
2c60: 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c  rgument non-NULL
2c70: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
2c80: 61 74 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c  atic void ifnull
2c90: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
2ca0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
2cb0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
2cc0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
2cd0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2ce0: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
2cf0: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
2d00: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
2d10: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69  alue_type(argv[i
2d20: 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ]) ){.      sqli
2d30: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
2d40: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
2d50: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
2d60: 5b 69 5d 29 2c 20 2d 31 2c 20 31 29 3b 0a 20 20  [i]), -1, 1);.  
2d70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
2d90: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 77  structure into w
2da0: 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61  hich to accumula
2db0: 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75  te text..*/.stru
2dc0: 63 74 20 64 73 74 72 20 7b 0a 20 20 69 6e 74 20  ct dstr {.  int 
2dd0: 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70 61 63  nAlloc;  /* Spac
2de0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  e allocated */. 
2df0: 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20 2f 2a   int nUsed;   /*
2e00: 20 53 70 61 63 65 20 75 73 65 64 20 2a 2f 0a 20   Space used */. 
2e10: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 2f 2a   char *z;     /*
2e20: 20 54 68 65 20 73 70 61 63 65 20 2a 2f 0a 7d 3b   The space */.};
2e30: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
2e40: 65 78 74 20 74 6f 20 61 20 64 73 74 72 0a 2a 2f  ext to a dstr.*/
2e50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 73 74  .static void dst
2e60: 72 41 70 70 65 6e 64 28 73 74 72 75 63 74 20 64  rAppend(struct d
2e70: 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  str *p, const ch
2e80: 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69 76 69 64  ar *z, int divid
2e90: 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73  er){.  int n = s
2ea0: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20  trlen(z);.  if( 
2eb0: 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b 20 32  p->nUsed + n + 2
2ec0: 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a   > p->nAlloc ){.
2ed0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a      char *zNew;.
2ee0: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
2ef0: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20  p->nAlloc*2 + n 
2f00: 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65 77 20  + 200;.    zNew 
2f10: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
2f20: 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->z, p->nAlloc)
2f30: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d  ;.    if( zNew==
2f40: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2f50: 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20  eFree(p->z);.   
2f60: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
2f70: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20  sizeof(*p));.   
2f80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2f90: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77  .    p->z = zNew
2fa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76 69  ;.  }.  if( divi
2fb0: 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e  der && p->nUsed>
2fc0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d  0 ){.    p->z[p-
2fd0: 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69  >nUsed++] = divi
2fe0: 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  der;.  }.  memcp
2ff0: 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64  y(&p->z[p->nUsed
3000: 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d  ], z, n+1);.  p-
3010: 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a  >nUsed += n;.}..
3020: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f  /*.** Invoked fo
3030: 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b 20  r each callback 
3040: 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65 63  from sqlite3Exec
3050: 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Func.*/.static i
3060: 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62  nt execFuncCallb
3070: 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  ack(void *pData,
3080: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
3090: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
30a0: 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75 63  otUsed){.  struc
30b0: 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74 72  t dstr *p = (str
30c0: 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61 3b  uct dstr*)pData;
30d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
30e0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
30f0: 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b  ){.    if( argv[
3100: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  i]==0 ){.      d
3110: 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e 55  strAppend(p, "NU
3120: 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d  LL", ' ');.    }
3130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74 72  else{.      dstr
3140: 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b 69  Append(p, argv[i
3150: 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20  ], ' ');.    }. 
3160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3170: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
3180: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f  tation of the x_
3190: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 66  sqlite3_exec() f
31a0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66  unction.  This f
31b0: 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a  unction takes.**
31c0: 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65   a single argume
31d0: 6e 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20  nt and attempts 
31e0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
31f0: 61 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20  argument as SQL 
3200: 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  code..** This is
3210: 20 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f   illegal and sho
3220: 75 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49  uld set the SQLI
3230: 54 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f  TE_MISUSE flag o
3240: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
3250: 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30  **.** 2004-Jan-0
3260: 37 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e  7:  We have chan
3270: 67 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65  ged this to make
3280: 20 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c   it legal to cal
3290: 6c 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  l sqlite3_exec()
32a0: 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  .** from within 
32b0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
32c0: 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72    .** .** This r
32d0: 6f 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73  outine simulates
32e0: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68   the effect of h
32f0: 61 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64  aving two thread
3300: 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  s attempt to.** 
3310: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
3320: 61 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d  abase at the sam
3330: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e time..*/.stati
3340: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
3350: 65 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ecFunc(.  sqlite
3360: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3370: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
3380: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
3390: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
33a0: 74 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20  truct dstr x;.  
33b0: 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69  memset(&x, 0, si
33c0: 7a 65 6f 66 28 78 29 29 3b 0a 20 20 73 71 6c 69  zeof(x));.  sqli
33d0: 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74 65  te3_exec((sqlite
33e0: 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
33f0: 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a 20 20  ata(context),.  
3400: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
3410: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
3420: 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e 63 43  .      execFuncC
3430: 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b  allback, &x, 0);
3440: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3450: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
3460: 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20 31 29  x.z, x.nUsed, 1)
3470: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 78  ;.  sqliteFree(x
3480: 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .z);.}../*.** Us
3490: 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65 73  age:  sqlite_tes
34a0: 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
34b0: 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  n DB.**.** Call 
34c0: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61  the sqlite3_crea
34d0: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20  te_function API 
34e0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  on the given dat
34f0: 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a  abase in order.*
3500: 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75  * to create a fu
3510: 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f  nction named "x_
3520: 63 6f 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73  coalesce".  This
3530: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
3540: 68 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a  he same thing.**
3550: 20 61 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63   as the "coalesc
3560: 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  e" function.  Th
3570: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  is function also
3580: 20 72 65 67 69 73 74 65 72 73 20 61 6e 20 53 51   registers an SQ
3590: 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61  L function.** na
35a0: 6d 65 64 20 22 78 5f 73 71 6c 69 74 65 33 5f 65  med "x_sqlite3_e
35b0: 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f 6b 65  xec" that invoke
35c0: 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  s sqlite3_exec()
35d0: 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69  .  Invoking sqli
35e0: 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e  te3_exec().** in
35f0: 20 74 68 69 73 20 77 61 79 20 69 73 20 69 6c 6c   this way is ill
3600: 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e 20 61  egal recursion a
3610: 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73 65 20  nd should raise 
3620: 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  an SQLITE_MISUSE
3630: 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65   error..** The e
3640: 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c 61 72  ffect is similar
3650: 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20 75 73   to trying to us
3660: 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  e the same datab
3670: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
3680: 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61  rom.** two threa
3690: 64 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ds at the same t
36a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ime..**.** The o
36b0: 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69  riginal motivati
36c0: 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  on for this rout
36d0: 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62  ine was to be ab
36e0: 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a  le to call the.*
36f0: 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
3700: 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69  _function functi
3710: 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79  on while a query
3720: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
3730: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74  in order.** to t
3740: 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  est the SQLITE_M
3750: 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20  ISUSE detection 
3760: 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
3770: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
3780: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
3790: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
37a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
37b0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
37c0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
37d0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
37e0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
37f0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3800: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3810: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3820: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
3830: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
3840: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
3850: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  .){.  sqlite *db
3860: 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20  ;.  extern void 
3870: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
3880: 69 74 65 2a 29 3b 0a 20 20 69 66 28 20 61 72 67  ite*);.  if( arg
3890: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
38a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
38b0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
38c0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
38d0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
38e0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
38f0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
3900: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3910: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
3920: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
3930: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
3940: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
3950: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
3960: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f  nction(db, "x_co
3970: 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20 30 2c 20  alesce", -1, 0, 
3980: 30 2c 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63  0, 0, ifnullFunc
3990: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
39a0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
39b0: 6f 6e 28 64 62 2c 20 22 78 5f 73 71 6c 69 74 65  on(db, "x_sqlite
39c0: 33 5f 65 78 65 63 22 2c 20 31 2c 20 30 2c 20 30  3_exec", 1, 0, 0
39d0: 2c 20 64 62 2c 0a 20 20 20 20 20 20 73 71 6c 69  , db,.      sqli
39e0: 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30 2c 20  te3ExecFunc, 0, 
39f0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
3a00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
3a10: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
3a20: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
3a30: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
3a40: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
3a50: 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78   struct CountCtx
3a60: 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63   CountCtx;.struc
3a70: 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69  t CountCtx {.  i
3a80: 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20  nt n;.};.static 
3a90: 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73  void countStep(s
3aa0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3ab0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
3ac0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
3ad0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e   **argv){.  Coun
3ae0: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
3af0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3b00: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
3b10: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
3b20: 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c   if( (argc==0 ||
3b30: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
3b40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
3b50: 28 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70  (argv[0]) ) && p
3b60: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a   ){.    p->n++;.
3b70: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
3b80: 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69  void countFinali
3b90: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
3ba0: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
3bb0: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
3bc0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
3bd0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
3be0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
3bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
3c00: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
3c10: 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a   p ? p->n : 0);.
3c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
3c30: 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65   sqlite_test_cre
3c40: 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 44 42  ate_aggregate DB
3c50: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
3c60: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
3c70: 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74  unction API on t
3c80: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
3c90: 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  e in order.** to
3ca0: 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69   create a functi
3cb0: 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e  on named "x_coun
3cc0: 74 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  t".  This functi
3cd0: 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  on does the same
3ce0: 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65   thing.** as the
3cf0: 20 22 6d 64 35 73 75 6d 22 20 66 75 6e 63 74 69   "md5sum" functi
3d00: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  on..**.** The or
3d10: 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f  iginal motivatio
3d20: 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  n for this routi
3d30: 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c  ne was to be abl
3d40: 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a  e to call the.**
3d50: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
3d60: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
3d70: 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79  on while a query
3d80: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
3d90: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74  in order.** to t
3da0: 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  est the SQLITE_M
3db0: 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20  ISUSE detection 
3dc0: 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
3dd0: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
3de0: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f  _aggregate(.  vo
3df0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3e00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3e10: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3e20: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3e30: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3e40: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3e50: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3e70: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3e80: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3e90: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3ea0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3eb0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  /.){.  sqlite *d
3ec0: 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
3ed0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
3ee0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3ef0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
3f00: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
3f10: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
3f20: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
3f30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3f40: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3f50: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3f60: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
3f70: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
3f80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
3f90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
3fa0: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
3fb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3fc0: 63 6f 75 6e 74 53 74 65 70 2c 63 6f 75 6e 74 46  countStep,countF
3fd0: 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69  inalize);.  sqli
3fe0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
3ff0: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
4000: 22 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ", 1, 0, 0, 0, 0
4010: 2c 63 6f 75 6e 74 53 74 65 70 2c 63 6f 75 6e 74  ,countStep,count
4020: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 72 65 74  Finalize);.  ret
4030: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
4040: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
4050: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
4060: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
4070: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
4080: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
4090: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
40a0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
40b0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
40c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
40d0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
40e0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
40f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
4100: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
4110: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
4120: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
4130: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
4140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4150: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4160: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4170: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4180: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4190: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
41a0: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63  int a[3], i;.  c
41b0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
41c0: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
41d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
41e0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
41f0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4200: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4210: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
4220: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
4230: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4240: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
4250: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
4260: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
4270: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
4280: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
4290: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
42a0: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
42b0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
42c0: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
42d0: 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[2]);.  Tcl_Ap
42e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
42f0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
4300: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
4310: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
4320: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
4330: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
4340: 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  tr FORMAT INTEGE
4350: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
4360: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
4370: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
4380: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
4390: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
43a0: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
43b0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
43c0: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
43d0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
43e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
43f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
4400: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
4410: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4420: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4430: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4440: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4450: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4460: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4470: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4480: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4490: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
44a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
44b0: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
44c0: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
44d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
44e0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
44f0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4500: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
4510: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
4520: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
4530: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
4540: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
4550: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
4560: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
4570: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
4580: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
4590: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
45a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
45b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
45c0: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
45d0: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
45e0: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
45f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4600: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
4610: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
4630: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4640: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
4650: 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20  intf_str FORMAT 
4660: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
4670: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
4680: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
4690: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
46a0: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75  ents and one dou
46b0: 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ble argument.*/.
46c0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
46d0: 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
46e0: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
46f0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4700: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4710: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4720: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4730: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4740: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4760: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4770: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
4780: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
4790: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
47a0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
47b0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75  t a[3], i;.  dou
47c0: 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ble r;.  char *z
47d0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
47e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
47f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4800: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4810: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4820: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
4830: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 53  FORMAT INT INT S
4840: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
4850: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4860: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
4870: 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<4; i++){.  
4880: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
4890: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
48a0: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &a[i-2]) ) ret
48b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
48c0: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
48d0: 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61  Double(interp, a
48e0: 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20 72 65  rgv[4], &r) ) re
48f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4900: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
4910: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
4920: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20  [0], a[1], r);. 
4930: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4940: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
4950: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4960: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
4970: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4980: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
4990: 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54  rintf_str FORMAT
49a0: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
49b0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
49c0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
49d0: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
49e0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
49f0: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
4a00: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
4a10: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
4a20: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
4a30: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
4a40: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
4a50: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
4a60: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
4a70: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
4a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4a90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
4aa0: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
4ab0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4ac0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4ad0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4ae0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4af0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4b00: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b20: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4b30: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4b40: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4b50: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4b60: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4b70: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
4b80: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
4b90: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
4ba0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4bb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4bc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4bd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4be0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
4bf0: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
4c00: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
4c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4c20: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
4c30: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
4c40: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
4c50: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
4c60: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
4c70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4c80: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
4c90: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
4ca0: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
4cb0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4cc0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
4cd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4ce0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
4cf0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
4d00: 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c  sage: sqlite_mal
4d10: 6c 6f 63 5f 66 61 69 6c 20 4e 0a 2a 2a 0a 2a 2a  loc_fail N.**.**
4d20: 20 52 69 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   Rig sqliteMallo
4d30: 63 28 29 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  c() to fail on t
4d40: 68 65 20 4e 2d 74 68 20 63 61 6c 6c 2e 20 20 54  he N-th call.  T
4d50: 75 72 6e 20 6f 66 66 20 74 68 69 73 20 6d 65 63  urn off this mec
4d60: 68 61 6e 69 73 6d 0a 2a 2a 20 61 6e 64 20 72 65  hanism.** and re
4d70: 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  set the sqlite3_
4d80: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 76 61  malloc_failed va
4d90: 72 69 61 62 6c 65 20 69 73 20 4e 3d 3d 30 2e 0a  riable is N==0..
4da0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4db0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
4dc0: 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  t sqlite_malloc_
4dd0: 66 61 69 6c 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  fail(.  void *No
4de0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4df0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4e00: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4e10: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4e20: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4e30: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e50: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4e60: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4e70: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4e80: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4e90: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4ea0: 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 61 72   int n;.  if( ar
4eb0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4ec0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4ed0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4ee0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4ef0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 4e  "", argv[0], " N
4f00: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4f10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4f20: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
4f30: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
4f40: 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72  [1], &n) ) retur
4f50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
4f60: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
4f70: 69 6c 20 3d 20 6e 3b 0a 20 20 73 71 6c 69 74 65  il = n;.  sqlite
4f80: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
4f90: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  = 0;.  return TC
4fa0: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
4fb0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
4fc0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 0a  ite_malloc_stat.
4fd0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
4fe0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72   number of prior
4ff0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
5000: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 73 71 6c  Malloc() and sql
5010: 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 23 69  iteFree()..*/.#i
5020: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5030: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  G.static int sql
5040: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 28  ite_malloc_stat(
5050: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
5060: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
5070: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
5080: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
5090: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
50a0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
50b0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
50c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
50d0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
50e0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
50f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
5100: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5110: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
5120: 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 73 70   zBuf[200];.  sp
5130: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 20  rintf(zBuf, "%d 
5140: 25 64 20 25 64 22 2c 20 73 71 6c 69 74 65 33 5f  %d %d", sqlite3_
5150: 6e 4d 61 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33  nMalloc, sqlite3
5160: 5f 6e 46 72 65 65 2c 20 73 71 6c 69 74 65 33 5f  _nFree, sqlite3_
5170: 69 4d 61 6c 6c 6f 63 46 61 69 6c 29 3b 0a 20 20  iMallocFail);.  
5180: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5190: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
51a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
51b0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
51c0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
51d0: 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53  te_abort.**.** S
51e0: 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f 63  hutdown the proc
51f0: 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ess immediately.
5200: 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20    This is not a 
5210: 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a  clean shutdown..
5220: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
5230: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
5240: 74 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c 69  the recoverabili
5250: 74 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ty of a database
5260: 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74   in.** the event
5270: 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63 72   of a program cr
5280: 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ash..*/.static i
5290: 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 28  nt sqlite_abort(
52a0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
52b0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
52c0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
52d0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
52e0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
52f0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
5300: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
5310: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5320: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
5330: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
5340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
5350: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5360: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ent */.){.  asse
5370: 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b  rt( interp==0 );
5380: 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20     /* This will 
5390: 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20  always fail */. 
53a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
53b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
53c0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  lowing routine i
53d0: 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64  s a user-defined
53e0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68   SQL function wh
53f0: 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69  ose purpose.** i
5400: 73 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71  s to test the sq
5410: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28  lite_set_result(
5420: 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  ) API..*/.static
5430: 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73   void testFunc(s
5440: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5450: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
5460: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
5470: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c   **argv){.  whil
5480: 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  e( argc>=2 ){.  
5490: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
54a0: 72 67 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  rg0 = sqlite3_va
54b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
54c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30  );.    if( zArg0
54d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   ){.      if( 0=
54e0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
54f0: 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b  zArg0, "int") ){
5500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5510: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
5520: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
5530: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29  ue_int(argv[1]))
5540: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5550: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5560: 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d  (zArg0,"int64")=
5570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5580: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5590: 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  64(context, sqli
55a0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
55b0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
55c0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
55d0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
55e0: 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a  "string")==0 ){.
55f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5600: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
5610: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
5620: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
5630: 2c 20 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , -1, 1);.      
5640: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
5650: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
5660: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
5670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
5680: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
5690: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
56a0: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
56b0: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
56c0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
56d0: 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c  ICmp(zArg0,"null
56e0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
56f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5700: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
5710: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
5720: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
5730: 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20  rg0,"value")==0 
5740: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5750: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
5760: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71  context, argv[sq
5770: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
5780: 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20  argv[1])]);.    
5790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
57a0: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
57b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
57c0: 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  se{.      goto e
57d0: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
57e0: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
57f0: 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
5800: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72  }.  return;..err
5810: 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
5820: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
5830: 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61 72  ontext,"first ar
5840: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
5850: 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
5860: 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69   "int int64 stri
5870: 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76  ng double null v
5880: 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f  alue", -1);.}../
5890: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
58a0: 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
58b0: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20  st_function  DB 
58c0: 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69   NAME.**.** Regi
58d0: 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53 51  ster the test SQ
58e0: 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  L function on th
58f0: 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75 6e  e database DB un
5900: 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d  der the name NAM
5910: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
5920: 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66   test_register_f
5930: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
5940: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
5950: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
5960: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
5970: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
5980: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
5990: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
59b0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
59c0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
59d0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
59e0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
59f0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
5a00: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 69 6e  sqlite *db;.  in
5a10: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
5a20: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
5a30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5a40: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
5a50: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
5a60: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
5a70: 20 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f 4e     " DB FUNCTION
5a80: 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20  -NAME", 0);.    
5a90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5aa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
5ab0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
5ac0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
5ad0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5ae0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
5af0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
5b00: 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d  n(db, argv[2], -
5b10: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 74 65 73 74  1, 0, 0, 0, test
5b20: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
5b30: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
5b40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5b50: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
5b60: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
5b70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5b80: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5b90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
5ba0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
5bb0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54  te3_finalize  ST
5bc0: 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69  MT .**.** Finali
5bd0: 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68  ze a statement h
5be0: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
5bf0: 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69   int test_finali
5c00: 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ze(.  void * cli
5c10: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
5c20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
5c30: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
5c40: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
5c50: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
5c60: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
5c70: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
5c80: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
5c90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5ca0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
5cb0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
5cc0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
5cd0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5ce0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
5cf0: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
5d00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5d10: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
5d20: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
5d30: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
5d40: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
5d50: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
5d60: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
5d70: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
5d80: 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  e(pStmt);.  Tcl_
5d90: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
5da0: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
5db0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
5dc0: 54 49 43 29 3b 0a 20 20 69 66 28 20 72 63 20 29  TIC);.  if( rc )
5dd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
5de0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5df0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5e00: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5e10: 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d  lite3_reset  STM
5e20: 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a  T .**.** Finaliz
5e30: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  e a statement ha
5e40: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
5e50: 69 6e 74 20 74 65 73 74 5f 72 65 73 65 74 28 0a  int test_reset(.
5e60: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
5e70: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
5e80: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
5e90: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
5ea0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
5eb0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
5ec0: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
5ed0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
5ee0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
5ef0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5f00: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
5f10: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
5f20: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
5f30: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
5f40: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d  v[0], 0), " <STM
5f50: 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  T>", 0);.    ret
5f60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5f70: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
5f80: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
5f90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
5fa0: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
5fb0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
5fc0: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
5fd0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
5fe0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
5ff0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6000: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
6010: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
6020: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
6030: 65 33 5f 72 65 73 65 74 20 20 20 56 4d 20 0a 2a  e3_reset   VM .*
6040: 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 76 69 72  *.** Reset a vir
6050: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 61 6e 64  tual machine and
6060: 20 70 72 65 70 61 72 65 20 69 74 20 74 6f 20 62   prepare it to b
6070: 65 20 72 75 6e 20 61 67 61 69 6e 2e 0a 2a 2f 0a  e run again..*/.
6080: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
6090: 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f  he "static_bind_
60a0: 76 61 6c 75 65 22 20 74 68 61 74 20 76 61 72 69  value" that vari
60b0: 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20  ables are bound 
60c0: 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46  to when.** the F
60d0: 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71  LAG option of sq
60e0: 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73  lite3_bind is "s
60f0: 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63  tatic".*/.static
6100: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74   char *sqlite_st
6110: 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20  atic_bind_value 
6120: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  = 0;../*.** Usag
6130: 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  e:  sqlite3_bind
6140: 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c 55 45    VM  IDX  VALUE
6150: 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65    FLAGS.**.** Se
6160: 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ts the value of 
6170: 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63 75 72  the IDX-th occur
6180: 61 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74  ance of "?" in t
6190: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a  he original SQL.
61a0: 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55  ** string.  VALU
61b0: 45 20 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c  E is the new val
61c0: 75 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  ue.  If FLAGS=="
61d0: 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45  null" then VALUE
61e0: 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61   is.** ignored a
61f0: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  nd the value is 
6200: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  set to NULL.  If
6210: 20 46 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22   FLAGS=="static"
6220: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
6230: 75 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ue is set to the
6240: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74   value of a stat
6250: 69 63 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65  ic variable name
6260: 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61  d.** "sqlite_sta
6270: 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e  tic_bind_value".
6280: 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72    If FLAGS=="nor
6290: 6d 61 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79  mal" then a copy
62a0: 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45  .** of the VALUE
62b0: 20 69 73 20 6d 61 64 65 2e 0a 2a 2f 0a 73 74 61   is made..*/.sta
62c0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
62d0: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
62e0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
62f0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
6300: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
6310: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
6320: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
6330: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
6340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6350: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
6360: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
6370: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
6380: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
6390: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
63a0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
63b0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
63c0: 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 61 72  nt idx;.  if( ar
63d0: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
63e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
63f0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
6400: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
6410: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
6420: 20 20 20 20 20 22 20 56 4d 20 49 44 58 20 56 41       " VM IDX VA
6430: 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63  LUE (null|static
6440: 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b  |normal)\"", 0);
6450: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6460: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
6470: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
6480: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
6490: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
64a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
64b0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
64c0: 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26  terp, argv[2], &
64d0: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
64e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73  L_ERROR;.  if( s
64f0: 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e  trcmp(argv[4],"n
6500: 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
6510: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
6520: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64  d_null(pStmt, id
6530: 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  x);.  }else if( 
6540: 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
6550: 73 74 61 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20  static")==0 ){. 
6560: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6570: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
6580: 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61   idx, sqlite_sta
6590: 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20  tic_bind_value, 
65a0: 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  -1, 0);.  }else 
65b0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
65c0: 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20  4],"normal")==0 
65d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
65e0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
65f0: 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33  tmt, idx, argv[3
6600: 5d 2c 20 2d 31 2c 20 31 29 3b 0a 20 20 7d 65 6c  ], -1, 1);.  }el
6610: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  se{.    Tcl_Appe
6620: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6630: 20 22 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73   "4th argument s
6640: 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
6650: 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20     "\"null\" or 
6660: 5c 22 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22  \"static\" or \"
6670: 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20  normal\"", 0);. 
6680: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6690: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ROR;.  }.  if( r
66a0: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  c ){.    char zB
66b0: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69  uf[50];.    spri
66c0: 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20  ntf(zBuf, "(%d) 
66d0: 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
66e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
66f0: 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
6700: 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29  e3ErrStr(rc), 0)
6710: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
6720: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
6730: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
6740: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
6750: 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
6760: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   This routine ex
6770: 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72  ists for one pur
6780: 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64  pose - to provid
6790: 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74  e a place to put
67a0: 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74   a.** breakpoint
67b0: 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63   with GDB that c
67c0: 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20  an be triggered 
67d0: 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20  using TCL code. 
67e0: 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20   The use.** for 
67f0: 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70  this is when a p
6800: 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66  articular test f
6810: 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68  ails on (say) th
6820: 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69  e 1485th iterati
6830: 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43  on..** In the TC
6840: 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77  L test script, w
6850: 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c  e can add code l
6860: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
6870: 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35      if {$i==1485
6880: 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a  } breakpoint.**.
6890: 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74  ** Then run test
68a0: 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64  fixture in the d
68b0: 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74  ebugger and wait
68c0: 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f   for the breakpo
68d0: 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20  int to.** fire. 
68e0: 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c   Then additional
68f0: 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e   breakpoints can
6900: 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65   be set to trace
6910: 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a   down the bug..*
6920: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
6930: 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20  t_breakpoint(.  
6940: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
6950: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6960: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
6970: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
6980: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
6990: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
69a0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
69b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
69c0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
69d0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
69e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
69f0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
6a00: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
6a10: 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  TCL_OK;         
6a20: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
6a30: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
6a40: 65 73 74 5f 62 69 6e 64 5f 69 6e 74 33 32 28 0a  est_bind_int32(.
6a50: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
6a60: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
6a70: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
6a80: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
6a90: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
6aa0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
6ab0: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
6ac0: 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b  dx;.  int value;
6ad0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
6ae0: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
6af0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6b00: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
6b10: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
6b20: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
6b30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6b40: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
6b50: 2c 20 22 20 3c 53 54 4d 54 3e 20 3c 70 61 72 61  , " <STMT> <para
6b60: 6d 20 6e 6f 2e 3e 20 3c 76 61 6c 75 65 3e 22 2c  m no.> <value>",
6b70: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
6b80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
6b90: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
6ba0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
6bb0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
6bc0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
6bd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6be0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
6bf0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
6c00: 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
6c10: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6c20: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
6c30: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
6c40: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
6c50: 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
6c60: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
6c70: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
6c80: 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
6c90: 6c 75 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  lue);.  if( rc!=
6ca0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6cb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6cc0: 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
6cd0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
6ce0: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
6cf0: 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a  _int64(.  void *
6d00: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
6d10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6d20: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
6d30: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
6d40: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
6d50: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
6d60: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36  .  int idx;.  i6
6d70: 34 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  4 value;.  int r
6d80: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
6d90: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
6da0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6db0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
6dc0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
6dd0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
6de0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
6df0: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d  v[0], 0), " <STM
6e00: 54 3e 20 3c 70 61 72 61 6d 20 6e 6f 2e 3e 20 3c  T> <param no.> <
6e10: 76 61 6c 75 65 3e 22 2c 20 30 29 3b 0a 20 20 20  value>", 0);.   
6e20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6e30: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
6e40: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
6e50: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
6e60: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
6e70: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
6e80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
6e90: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
6ea0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
6eb0: 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
6ec0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
6ed0: 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
6ee0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
6ef0: 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
6f00: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
6f10: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
6f20: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
6f30: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
6f40: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
6f50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6f60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6f70: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
6f80: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
6f90: 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64   int test_bind_d
6fa0: 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
6fb0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
6fc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6fd0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
6fe0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
6ff0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
7000: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
7010: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75    int idx;.  dou
7020: 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ble value;.  int
7030: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
7040: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
7050: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7060: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
7070: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
7080: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
7090: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
70a0: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
70b0: 54 4d 54 3e 20 3c 70 61 72 61 6d 20 6e 6f 2e 3e  TMT> <param no.>
70c0: 20 3c 76 61 6c 75 65 3e 22 2c 20 30 29 3b 0a 20   <value>", 0);. 
70d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
70e0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
70f0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
7100: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
7110: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
7120: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
7130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
7140: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
7150: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
7160: 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
7170: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7180: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
7190: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
71a0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
71b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
71c0: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
71d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
71e0: 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  e(pStmt, idx, va
71f0: 6c 75 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  lue);.  if( rc!=
7200: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7210: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7220: 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
7230: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
7240: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
7250: 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
7260: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
7270: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7280: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
7290: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
72a0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
72b0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
72c0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
72d0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
72e0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
72f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7300: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
7310: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
7320: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
7330: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
7340: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
7350: 54 4d 54 3e 20 3c 70 61 72 61 6d 20 6e 6f 2e 3e  TMT> <param no.>
7360: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
7370: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7380: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
7390: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
73a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
73b0: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
73c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
73d0: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
73e0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
73f0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
7400: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7410: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
7420: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
7430: 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69  pStmt, idx);.  i
7440: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7450: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
7460: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
7470: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7480: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
7490: 73 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20  st_bind_text(.  
74a0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
74b0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
74c0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
74d0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
74e0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
74f0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
7500: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
7510: 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
7520: 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
7530: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
7540: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
7550: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7560: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
7570: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
7580: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
7590: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
75a0: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
75b0: 20 3c 53 54 4d 54 3e 20 3c 70 61 72 61 6d 20 6e   <STMT> <param n
75c0: 6f 2e 3e 20 3c 76 61 6c 75 65 3e 22 0a 20 20 20  o.> <value>".   
75d0: 20 20 20 20 20 22 20 3c 62 79 74 65 73 3e 22 2c       " <bytes>",
75e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
75f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
7600: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
7610: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
7620: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
7630: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
7640: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7650: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
7660: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
7670: 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
7680: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
7690: 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63  OR;.  value = Tc
76a0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
76b0: 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [3]);.  if( Tcl_
76c0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
76d0: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
76e0: 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
76f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
7700: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
7710: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
7720: 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 31   value, bytes, 1
7730: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7740: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
7750: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7760: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
7770: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
7780: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  int test_bind_te
7790: 78 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  xt16(.  void * c
77a0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
77b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
77c0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
77d0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
77e0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
77f0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
7800: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
7810: 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
7820: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
7830: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
7840: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7850: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7860: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
7870: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
7880: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
7890: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
78a0: 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 20  ], 0), " <STMT> 
78b0: 3c 70 61 72 61 6d 20 6e 6f 2e 3e 20 3c 76 61 6c  <param no.> <val
78c0: 75 65 3e 22 0a 20 20 20 20 20 20 20 20 22 20 3c  ue>".        " <
78d0: 62 79 74 65 73 3e 22 2c 20 30 29 3b 0a 20 20 20  bytes>", 0);.   
78e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
78f0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
7900: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
7910: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
7920: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
7930: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
7940: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
7950: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
7960: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
7970: 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
7980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
7990: 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  lue = Tcl_GetByt
79a0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
79b0: 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 69 66 28  jv[3], 0);.  if(
79c0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
79d0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
79e0: 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
79f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7a00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
7a10: 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d  bind_text16(pStm
7a20: 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29  t, idx, (void *)
7a30: 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 31 29  value, bytes, 1)
7a40: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7a50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
7a60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7a70: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
7a80: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
7a90: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f  nt test_bind_blo
7aa0: 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  b(.  void * clie
7ab0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
7ac0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
7ad0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
7ae0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
7af0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
7b00: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
7b10: 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
7b20: 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
7b30: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
7b40: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
7b50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7b60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
7b70: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
7b80: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
7b90: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
7ba0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
7bb0: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 20 3c 70 61  0), " <STMT> <pa
7bc0: 72 61 6d 20 6e 6f 2e 3e 20 3c 76 61 6c 75 65 3e  ram no.> <value>
7bd0: 22 0a 20 20 20 20 20 20 20 20 22 20 3c 62 79 74  ".        " <byt
7be0: 65 73 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  es>", 0);.    re
7bf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7c00: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
7c10: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
7c20: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
7c30: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
7c40: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7c50: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
7c60: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
7c70: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
7c80: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
7c90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
7ca0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7cb0: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (objv[3]);.  if(
7cc0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
7cd0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
7ce0: 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
7cf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7d00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
7d10: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
7d20: 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
7d30: 65 73 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  es, 1);.  if( rc
7d40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7d50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7d60: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
7d70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
7d80: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
7d90: 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a  e3_errcode DB.**
7da0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
7db0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
7dc0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
7dd0: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
7de0: 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63  * API.** error c
7df0: 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54  ode. e.g. "SQLIT
7e00: 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61  E_ERROR"..*/.sta
7e10: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
7e20: 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  code(.  void * c
7e30: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
7e40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7e50: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
7e60: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
7e70: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
7e80: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62  3 *db;..  if( ob
7e90: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
7ea0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7eb0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
7ec0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
7ed0: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
7ee0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
7ef0: 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
7f00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7f10: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
7f20: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
7f30: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
7f40: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
7f50: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
7f60: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
7f70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
7f80: 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 73  ar *)errorName(s
7f90: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
7fa0: 62 29 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  b)), 0);.  retur
7fb0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
7fc0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74  ** Usage:   test
7fd0: 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a  _errmsg DB.**.**
7fe0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46   Returns the UTF
7ff0: 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  -8 representatio
8000: 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
8010: 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
8020: 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
8030: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
8040: 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  PI call..*/.stat
8050: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
8060: 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sg(.  void * cli
8070: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
8080: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
8090: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
80a0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
80b0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  [].){.  sqlite *
80c0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
80d0: 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f   *zErr;..  if( o
80e0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
80f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8100: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8110: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8120: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
8130: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8140: 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
8150: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8160: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
8170: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
8180: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
8190: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
81a0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
81b0: 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20  RROR;..  zErr = 
81c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
81d0: 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  b);.  Tcl_SetObj
81e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
81f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8200: 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65  zErr, -1));.  re
8210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8220: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74  /*.** Usage:   t
8230: 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a  est_errmsg16 DB.
8240: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
8250: 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73 65  e UTF-16 represe
8260: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ntation of the e
8270: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
8280: 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d  ing for the.** m
8290: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
82a0: 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54  e3_* API call. T
82b0: 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61 72  his is a byte ar
82c0: 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68  ray object at th
82d0: 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c  e TCL .** level,
82e0: 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73   and it includes
82f0: 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20 74   the 0x00 0x00 t
8300: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20  erminator bytes 
8310: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
8320: 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69  e.** UTF-16 stri
8330: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
8340: 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28  t test_errmsg16(
8350: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
8360: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
8370: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
8380: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
8390: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
83a0: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
83b0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
83c0: 45 72 72 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Err;.  int bytes
83d0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
83e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
83f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8400: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8410: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
8420: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
8430: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
8440: 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
8450: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8460: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
8470: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
8480: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
8490: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
84a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
84b0: 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
84c0: 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a  3_errmsg16(db);.
84d0: 20 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65    bytes = sqlite
84e0: 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 45  3utf16ByteLen(zE
84f0: 72 72 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 53  rr, -1);.  Tcl_S
8500: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
8510: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
8520: 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79  rrayObj(zErr, by
8530: 74 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  tes));.  return 
8540: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8550: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
8560: 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62  prepare DB sql b
8570: 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a  ytes tailvar.**.
8580: 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
8590: 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
85a0: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
85b0: 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
85c0: 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
85d0: 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
85e0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
85f0: 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
8600: 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
8610: 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
8620: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
8630: 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
8640: 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
8650: 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
8660: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
8670: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
8680: 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64  _prepare(.  void
8690: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
86a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
86b0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
86c0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
86d0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
86e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
86f0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
8700: 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
8710: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
8720: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
8730: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
8740: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
8750: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
8760: 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
8770: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8780: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8790: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
87a0: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
87b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
87c0: 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
87d0: 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
87e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
87f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8800: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
8810: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
8820: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
8830: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
8840: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
8850: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
8860: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
8870: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
8880: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
8890: 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
88a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
88b0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
88c0: 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
88d0: 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
88e0: 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28  , &zTail);.  if(
88f0: 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 69 66   zTail ){.    if
8900: 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
8910: 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
8920: 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  s - (zTail-zSql)
8930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
8940: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
8950: 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54  p, objv[4], 0, T
8960: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8970: 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
8980: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
8990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
89a0: 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
89b0: 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
89c0: 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
89d0: 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
89e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
89f0: 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
8a00: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
8a10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8a20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
8a30: 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
8a40: 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74  f( makePointerSt
8a50: 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
8a60: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
8a70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
8a80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8a90: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
8aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
8ab0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
8ac0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
8ad0: 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62 79  repare DB sql by
8ae0: 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a  tes tailvar.**.*
8af0: 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
8b00: 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
8b10: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
8b20: 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
8b30: 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
8b40: 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
8b50: 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
8b60: 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
8b70: 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
8b80: 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
8b90: 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
8ba0: 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
8bb0: 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
8bc0: 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
8bd0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8be0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
8bf0: 70 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69  prepare16(.  voi
8c00: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
8c10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8c20: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
8c30: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
8c40: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
8c50: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
8c60: 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a  nst void *zSql;.
8c70: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54    const void *zT
8c80: 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f  ail = 0;.  Tcl_O
8c90: 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20  bj *pTail = 0;. 
8ca0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
8cb0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
8cc0: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
8cd0: 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20   bytes;         
8ce0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
8cf0: 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20  teger specified 
8d00: 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e  as arg 3 */.  in
8d10: 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20  t objlen;       
8d20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
8d30: 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68  yte-array length
8d40: 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20   of arg 2 */..  
8d50: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
8d60: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8d70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8d80: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8d90: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
8da0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
8db0: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
8dc0: 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
8dd0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8de0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8df0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
8e00: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
8e10: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
8e20: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
8e30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
8e40: 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Sql = Tcl_GetByt
8e50: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
8e60: 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b  jv[2], &objlen);
8e70: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
8e80: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
8e90: 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
8ea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
8eb0: 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 53 51 4c  RROR;..  if( SQL
8ec0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
8ed0: 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53  prepare16(db, zS
8ee0: 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
8ef0: 74 2c 20 26 7a 54 61 69 6c 29 20 29 7b 0a 20 20  t, &zTail) ){.  
8f00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8f10: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a  OR;.  }..  if( z
8f20: 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c  Tail ){.    objl
8f30: 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28  en = objlen - ((
8f40: 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
8f50: 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  )zSql);.  }else{
8f60: 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b  .    objlen = 0;
8f70: 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54  .  }.  pTail = T
8f80: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
8f90: 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20  bj((u8 *)zTail, 
8fa0: 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49  objlen);.  Tcl_I
8fb0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
8fc0: 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74  l);.  Tcl_ObjSet
8fd0: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
8fe0: 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
8ff0: 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
9000: 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a  fCount(pTail);..
9010: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
9020: 20 20 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74     if( makePoint
9030: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
9040: 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
9050: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9060: 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
9070: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
9080: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
9090: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
90a0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
90b0: 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f  _open filename ?
90c0: 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f  options-list?.*/
90d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
90e0: 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20  _open(.  void * 
90f0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
9100: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9110: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
9120: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
9130: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
9140: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
9150: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
9160: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
9170: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
9180: 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
9190: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
91a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
91b0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
91c0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
91d0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
91e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
91f0: 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20  0]), " filename 
9200: 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30  options-list", 0
9210: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
9230: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f  zFilename = Tcl_
9240: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
9250: 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
9260: 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  e3_open(zFilenam
9270: 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66  e, &db);.  .  if
9280: 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  ( makePointerStr
9290: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
92a0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
92b0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
92c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
92d0: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
92e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
92f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
9300: 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65  ite3_open16 file
9310: 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a  name options.*/.
9320: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
9330: 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a  open16(.  void *
9340: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
9350: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9360: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
9370: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
9380: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73  objv[].){.  cons
9390: 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
93a0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
93b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
93c0: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
93d0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
93e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
93f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9400: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9410: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
9420: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
9430: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c  (objv[0]), " fil
9440: 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69  ename options-li
9450: 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  st", 0);.    ret
9460: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9470: 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   }..  zFilename 
9480: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
9490: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
94a0: 5d 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  ], 0);.  rc = sq
94b0: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69  lite3_open16(zFi
94c0: 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
94d0: 0a 20 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74  .  if( makePoint
94e0: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
94f0: 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
9500: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
9510: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9520: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
9530: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9550: 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53  : sqlite3_step S
9560: 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63  TMT.**.** Advanc
9570: 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
9580: 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  to the next row.
9590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
95a0: 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64  est_step(.  void
95b0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
95c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
95d0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
95e0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
95f0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
9600: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
9610: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
9620: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
9630: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9640: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9650: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9660: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
9670: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
9680: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
9690: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
96a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
96b0: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
96c0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
96d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
96e0: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
96f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9700: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
9710: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a  3_step(pStmt);..
9720: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9730: 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53 51 4c  _DONE && rc!=SQL
9740: 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75 72 6e  ITE_ROW ) return
9750: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
9760: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
9770: 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f  rp, (char *)erro
9780: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
9790: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
97a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
97b0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
97c0: 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ount STMT .**.**
97d0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
97e0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
97f0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71  turned by the sq
9800: 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54  l statement STMT
9810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9820: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
9830: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
9840: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
9850: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
9860: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
9870: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
9880: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
9890: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
98a0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
98b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
98c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
98d0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
98e0: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
98f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9900: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
9910: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
9920: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9930: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
9940: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
9950: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
9960: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
9970: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
9980: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
9990: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
99a0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
99b0: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
99c0: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  n_count(pStmt)))
99d0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
99e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
99f0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
9a00: 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  n_type STMT colu
9a10: 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
9a20: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  the type of the 
9a30: 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
9a40: 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
9a50: 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73  urrent row..*/.s
9a60: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
9a70: 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f  olumn_type(.  vo
9a80: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
9a90: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9aa0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
9ab0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
9ac0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
9ad0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
9ae0: 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
9af0: 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28    int tp;..  if(
9b00: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
9b10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9b20: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9b30: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9b40: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
9b50: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
9b60: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
9b70: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
9b80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9b90: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
9ba0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
9bb0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
9bc0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
9bd0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
9be0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
9bf0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
9c00: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
9c10: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
9c20: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20  CL_ERROR;..  tp 
9c30: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
9c40: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c  _type(pStmt, col
9c50: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20  );.  switch( tp 
9c60: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
9c70: 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20  TE_INTEGER: .   
9c80: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
9c90: 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45  (interp, "INTEGE
9ca0: 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  R", TCL_STATIC);
9cb0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
9cc0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
9cd0: 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  ULL:.      Tcl_S
9ce0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
9cf0: 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41   "NULL", TCL_STA
9d00: 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
9d10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
9d20: 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20  ITE_FLOAT:.     
9d30: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
9d40: 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20  nterp, "FLOAT", 
9d50: 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
9d60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9d70: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
9d80: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
9d90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45  sult(interp, "TE
9da0: 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  XT", TCL_STATIC)
9db0: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
9dc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9dd0: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f  BLOB:.      Tcl_
9de0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
9df0: 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54  , "BLOB", TCL_ST
9e00: 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
9e10: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
9e20: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  :.      assert(0
9e30: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
9e40: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
9e50: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
9e60: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54  _column_int64 ST
9e70: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
9e80: 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
9e90: 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
9ea0: 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
9eb0: 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e  t row cast as an
9ec0: 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74  .** wide (64-bit
9ed0: 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  ) integer..*/.st
9ee0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
9ef0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f  lumn_int64(.  vo
9f00: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
9f10: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9f20: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
9f30: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
9f40: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
9f50: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
9f60: 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
9f70: 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69    i64 iVal;..  i
9f80: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
9f90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9fa0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
9fb0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
9fc0: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
9fd0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9fe0: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
9ff0: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
a000: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a010: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
a020: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
a030: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
a040: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
a050: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
a060: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
a070: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a080: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
a090: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
a0a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69   TCL_ERROR;..  i
a0b0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
a0c0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
a0d0: 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
a0e0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
a0f0: 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
a100: 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72  tObj(iVal));.  r
a110: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a120: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
a130: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
a140: 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f  b STMT column.*/
a150: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
a160: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20  _column_blob(.  
a170: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
a180: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
a190: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
a1a0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
a1b0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
a1c0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
a1d0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
a1e0: 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ;..  int len;.  
a1f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
a200: 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  b;..  if( objc!=
a210: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
a220: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a230: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
a240: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
a250: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
a260: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
a270: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
a280: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a290: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
a2a0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
a2b0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
a2c0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
a2d0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
a2e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a2f0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
a300: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a310: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
a320: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a330: 52 3b 0a 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71  R;..  pBlob = sq
a340: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
a350: 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  b(pStmt, col);. 
a360: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63   len = sqlite3_c
a370: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
a380: 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
a390: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a3a0: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
a3b0: 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c  rrayObj(pBlob, l
a3c0: 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  en));.  return T
a3d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
a3e0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
a3f0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d  olumn_double STM
a400: 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
a410: 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
a420: 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
a430: 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
a440: 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64   row cast as a d
a450: 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
a460: 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
a470: 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
a480: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
a490: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
a4a0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
a4b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a4c0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
a4d0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
a4e0: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64  ;.  int col;.  d
a4f0: 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69  ouble rVal;..  i
a500: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
a510: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a520: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
a530: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
a540: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
a550: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
a560: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
a570: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
a580: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a590: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
a5a0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
a5b0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
a5c0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
a5d0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
a5e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
a5f0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a600: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
a610: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
a620: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
a630: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
a640: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
a650: 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
a660: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a670: 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  rp, Tcl_NewDoubl
a680: 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72  eObj(rVal));.  r
a690: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a6a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
a6b0: 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
a6c0: 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
a6d0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
a6e0: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
a6f0: 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74  ed by the sql st
a700: 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f  atement STMT..*/
a710: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
a720: 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76  _data_count(.  v
a730: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
a740: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
a750: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
a760: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
a770: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
a780: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a790: 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
a7a0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
a7b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a7c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
a7d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a7e0: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
a7f0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
a800: 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
a810: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
a820: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a830: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
a840: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
a850: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
a860: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
a870: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a880: 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
a890: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
a8a0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
a8b0: 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28  ite3_data_count(
a8c0: 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
a8d0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
a8e0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
a8f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53  e3_column_text S
a900: 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
a910: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a920: 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20  column_decltype 
a930: 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
a940: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
a950: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d  _column_name STM
a960: 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
a970: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
a980: 5f 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20  _utf8(.  void * 
a990: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
a9a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a9b0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
a9c0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
a9d0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
a9e0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
a9f0: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e    int col;.  con
aa00: 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63  st char *(*xFunc
aa10: 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
aa20: 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61   int) = clientDa
aa30: 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta;.  const char
aa40: 20 2a 7a 52 65 74 3b 0a 0a 20 20 69 66 28 20 6f   *zRet;..  if( o
aa50: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
aa60: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
aa70: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
aa80: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
aa90: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
aaa0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
aab0: 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
aac0: 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
aad0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aae0: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
aaf0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
ab00: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
ab10: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
ab20: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ab30: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
ab40: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
ab50: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
ab60: 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
ab70: 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
ab80: 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
ab90: 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
aba0: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
abb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
abc0: 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
abd0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
abe0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
abf0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
ac00: 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
ac10: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
ac20: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
ac30: 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
ac40: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
ac50: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ac60: 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
ac70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
ac80: 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
ac90: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
aca0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
acb0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
acc0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
acd0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
ace0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
acf0: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
ad00: 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ol;.  Tcl_Obj *p
ad10: 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Ret;.  const voi
ad20: 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f  d *zName16;.  co
ad30: 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e  nst void *(*xFun
ad40: 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
ad50: 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44  , int) = clientD
ad60: 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ata;..  if( objc
ad70: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
ad80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ad90: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
ada0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
adb0: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
adc0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
add0: 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
ade0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
adf0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ae00: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
ae10: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
ae20: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
ae30: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
ae40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ae50: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
ae60: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
ae70: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
ae80: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ae90: 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20  ROR;..  zName16 
aea0: 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
aeb0: 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ol);.  if( zName
aec0: 31 36 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  16 ){.    pRet =
aed0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
aee0: 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71  yObj(zName16, sq
aef0: 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c 65  lite3utf16ByteLe
af00: 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32  n(zName16, -1)+2
af10: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
af20: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
af30: 70 52 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pRet);.  }..  re
af40: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
af50: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
af60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20  ite3_column_int 
af70: 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
af80: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
af90: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54  _column_bytes ST
afa0: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
afb0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
afc0: 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54  olumn_bytes16 ST
afd0: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a  MT column.**.*/.
afe0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
aff0: 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64  stmt_int(.  void
b000: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
b010: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
b020: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
b030: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
b040: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
b050: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
b060: 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
b070: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  int (*xFunc)(sql
b080: 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
b090: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a   = clientData;..
b0a0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
b0b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b0c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
b0d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
b0e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
b0f0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
b100: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
b110: 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
b120: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b130: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
b140: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
b150: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
b160: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
b170: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
b180: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
b190: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
b1a0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
b1b0: 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
b1c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
b1d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
b1e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
b1f0: 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70  ewIntObj(xFunc(p
b200: 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20  Stmt, col)));.  
b210: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
b220: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
b230: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
b240: 64 57 72 69 74 65 20 3c 66 69 6c 65 6e 61 6d 65  dWrite <filename
b250: 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
b260: 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70  test_sqlite3OsOp
b270: 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 76  enReadWrite(.  v
b280: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
b290: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
b2a0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
b2b0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
b2c0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
b2d0: 20 4f 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b   OsFile * pFile;
b2e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
b2f0: 20 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a   dummy;.  char z
b300: 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
b310: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
b320: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b330: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
b340: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
b350: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
b360: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
b370: 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
b380: 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
b390: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b3a0: 7d 0a 0a 20 20 70 46 69 6c 65 20 3d 20 73 71 6c  }..  pFile = sql
b3b0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
b3c0: 28 4f 73 46 69 6c 65 29 29 3b 0a 20 20 72 63 20  (OsFile));.  rc 
b3d0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
b3e0: 65 61 64 57 72 69 74 65 28 54 63 6c 5f 47 65 74  eadWrite(Tcl_Get
b3f0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b400: 20 70 46 69 6c 65 2c 20 26 64 75 6d 6d 79 29 3b   pFile, &dummy);
b410: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b420: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
b430: 74 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a 20  teFree(pFile);. 
b440: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
b450: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
b460: 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  )errorName(rc), 
b470: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
b480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b490: 52 3b 0a 20 20 7d 0a 20 20 6d 61 6b 65 50 6f 69  R;.  }.  makePoi
b4a0: 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
b4b0: 7a 42 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20  zBuf, pFile);.  
b4c0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
b4d0: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
b4e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b4f0: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
b500: 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  ge:  sqlite3OsCl
b510: 6f 73 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65  ose <file handle
b520: 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
b530: 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c  test_sqlite3OsCl
b540: 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ose(.  void * cl
b550: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
b560: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
b570: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
b580: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b590: 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
b5a0: 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
b5b0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
b5c0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
b5d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b5e0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
b5f0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
b600: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
b610: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
b620: 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30  " filehandle", 0
b630: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b640: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b650: 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74  if( getFilePoint
b660: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
b670: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b680: 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20  ), &pFile) ){.  
b690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b6a0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
b6b0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 46  qlite3OsClose(pF
b6c0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
b6d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b6e0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
b6f0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
b700: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
b710: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
b720: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b730: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
b740: 65 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75  e(pFile);.  retu
b750: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
b760: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
b770: 74 65 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65 20  te3OsLock <file 
b780: 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79 70  handle> <locktyp
b790: 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e>.*/.static int
b7a0: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c   test_sqlite3OsL
b7b0: 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
b7c0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
b7d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
b7e0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
b7f0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b800: 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
b810: 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
b820: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
b830: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
b840: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b850: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
b860: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
b870: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
b880: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
b890: 20 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c 65   .        " file
b8a0: 68 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c 52  handle (SHARED|R
b8b0: 45 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c  ESERVED|PENDING|
b8c0: 45 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29 3b  EXCLUSIVE)", 0);
b8d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b8e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
b8f0: 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  ( getFilePointer
b900: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b910: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b920: 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20   &pFile) ){.    
b930: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b940: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d  ;.  }..  if( 0==
b950: 73 74 72 63 6d 70 28 22 53 48 41 52 45 44 22 2c  strcmp("SHARED",
b960: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b970: 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[2])) ){.    
b980: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
b990: 63 6b 28 70 46 69 6c 65 2c 20 53 48 41 52 45 44  ck(pFile, SHARED
b9a0: 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c  _LOCK);.  }.  el
b9b0: 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70  se if( 0==strcmp
b9c0: 28 22 52 45 53 45 52 56 45 44 22 2c 20 54 63 6c  ("RESERVED", Tcl
b9d0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b9e0: 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  2])) ){.    rc =
b9f0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
ba00: 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 4c  File, RESERVED_L
ba10: 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  OCK);.  }.  else
ba20: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22   if( 0==strcmp("
ba30: 50 45 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47 65  PENDING", Tcl_Ge
ba40: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
ba50: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
ba60: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c  lite3OsLock(pFil
ba70: 65 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  e, PENDING_LOCK)
ba80: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
ba90: 20 30 3d 3d 73 74 72 63 6d 70 28 22 45 58 43 4c   0==strcmp("EXCL
baa0: 55 53 49 56 45 22 2c 20 54 63 6c 5f 47 65 74 53  USIVE", Tcl_GetS
bab0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
bac0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
bad0: 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c  te3OsLock(pFile,
bae0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
baf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
bb00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bb10: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
bb20: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
bb30: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54   \"", .        T
bb40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
bb50: 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  v[0]), .        
bb60: 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48  " filehandle (SH
bb70: 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45  ARED|RESERVED|PE
bb80: 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29  NDING|EXCLUSIVE)
bb90: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
bba0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
bbb0: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
bbc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
bbd0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
bbe0: 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72  p, (char *)error
bbf0: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
bc00: 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
bc10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
bc20: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
bc30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
bc40: 3a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  :  sqlite3OsUnlo
bc50: 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e  ck <file handle>
bc60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
bc70: 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c  est_sqlite3OsUnl
bc80: 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
bc90: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
bca0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
bcb0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
bcc0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
bcd0: 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
bce0: 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
bcf0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
bd00: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
bd10: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
bd20: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
bd30: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
bd40: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
bd50: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
bd60: 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30  " filehandle", 0
bd70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
bd80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
bd90: 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74  if( getFilePoint
bda0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
bdb0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
bdc0: 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20  ), &pFile) ){.  
bdd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
bde0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
bdf0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
be00: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
be10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
be20: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
be30: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
be40: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  errorName(rc), T
be50: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
be60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
be70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
be80: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
be90: 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64  Register command
bea0: 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  s with the TCL i
beb0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
bec0: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49  nt Sqlitetest1_I
bed0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
bee0: 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72  interp){.  exter
bef0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
bf00: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  arch_count;.  ex
bf10: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
bf20: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
bf30: 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
bf40: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65  qlite3_open_file
bf50: 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
bf60: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72   int sqlite3_cur
bf70: 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20 73 74 61  rent_time;.  sta
bf80: 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
bf90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
bfa0: 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20      Tcl_CmdProc 
bfb0: 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64  *xProc;.  } aCmd
bfc0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73  [] = {.     { "s
bfd0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
bfe0: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  nt",           (
bff0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
c000: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
c010: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
c020: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
c030: 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  tr",           (
c040: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
c050: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
c060: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
c070: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
c080: 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28  ouble",        (
c090: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
c0a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
c0b0: 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ble },.     { "s
c0c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
c0d0: 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28  caled",        (
c0e0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
c0f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
c100: 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  led },.     { "s
c110: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a  qlite3_mprintf_z
c120: 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28  _test",        (
c130: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
c140: 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20  t_mprintf_z     
c150: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
c160: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
c170: 74 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54  t_rowid",     (T
c180: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
c190: 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20  _last_rowid     
c1a0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
c1b0: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
c1c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
c1d0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
c1e0: 65 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20  exec_printf     
c1f0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
c200: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
c210: 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c  intf",      (Tcl
c220: 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67  _CmdProc*)test_g
c230: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20  et_table_printf 
c240: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
c250: 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20  e3_close",      
c260: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
c270: 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
c280: 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d  test_close     }
c290: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
c2a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c2b0: 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  n",       (Tcl_C
c2c0: 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65  mdProc*)test_cre
c2d0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c  ate_function  },
c2e0: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
c2f0: 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
c300: 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  e",      (Tcl_Cm
c310: 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61  dProc*)test_crea
c320: 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a  te_aggregate },.
c330: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72       { "sqlite_r
c340: 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e  egister_test_fun
c350: 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64  ction", (Tcl_Cmd
c360: 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73  Proc*)test_regis
c370: 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20  ter_func    },. 
c380: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62      { "sqlite_ab
c390: 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ort",           
c3a0: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
c3b0: 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72  roc*)sqlite_abor
c3c0: 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69  t          },.#i
c3d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
c3e0: 47 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  G.     { "sqlite
c3f0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 22 2c 20 20  _malloc_fail",  
c400: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
c410: 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 6d  mdProc*)sqlite_m
c420: 61 6c 6c 6f 63 5f 66 61 69 6c 20 20 20 20 7d 2c  alloc_fail    },
c430: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
c440: 6d 61 6c 6c 6f 63 5f 73 74 61 74 22 2c 20 20 20  malloc_stat",   
c450: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
c460: 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 6d 61  dProc*)sqlite_ma
c470: 6c 6c 6f 63 5f 73 74 61 74 20 20 20 20 7d 2c 0a  lloc_stat    },.
c480: 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
c490: 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20  qlite_bind",    
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
c4c0: 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20  st_bind         
c4d0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
c4e0: 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20  reakpoint",     
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
c510: 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20  st_breakpoint   
c520: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74      },.  };.  st
c530: 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
c540: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
c550: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50       Tcl_ObjCmdP
c560: 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20  roc *xProc;.    
c570: 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
c580: 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d  a;.  } aObjCmd[]
c590: 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c   = {.     { "sql
c5a0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 33 32 22  ite3_bind_int32"
c5b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
c5c0: 74 5f 62 69 6e 64 5f 69 6e 74 33 32 2c 20 30 20  t_bind_int32, 0 
c5d0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
c5e0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
c5f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
c600: 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 20 2c 20  st_bind_int64 , 
c610: 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  0   },.     { "s
c620: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
c630: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  le",           t
c640: 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c  est_bind_double,
c650: 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
c660: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
c670: 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
c680: 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20  test_bind_null  
c690: 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
c6a0: 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65  "sqlite3_bind_te
c6b0: 78 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xt",            
c6c0: 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20   test_bind_text 
c6d0: 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
c6e0: 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74   "sqlite3_bind_t
c6f0: 65 78 74 31 36 22 2c 20 20 20 20 20 20 20 20 20  ext16",         
c700: 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74    test_bind_text
c710: 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  16   ,0 },.     
c720: 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
c730: 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  blob",          
c740: 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f     test_bind_blo
c750: 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  b     ,0 },.    
c760: 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63   { "sqlite3_errc
c770: 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ode",           
c780: 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65      test_errcode
c790: 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
c7a0: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
c7b0: 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  msg",           
c7c0: 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
c7d0: 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
c7e0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
c7f0: 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20  rmsg16",        
c800: 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
c810: 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g16      ,0 },. 
c820: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
c830: 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  pen",           
c840: 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
c850: 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
c860: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
c870: 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20  open16",        
c880: 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
c890: 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n16        ,0 },
c8a0: 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
c8b0: 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20  3_prepare",     
c8c0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
c8d0: 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20  repare       ,0 
c8e0: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
c8f0: 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20  e3_prepare16",  
c900: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
c910: 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30  prepare16     ,0
c920: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
c930: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20 20  te3_finalize",  
c940: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
c950: 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20 20 2c  _finalize      ,
c960: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
c970: 69 74 65 33 5f 72 65 73 65 74 22 2c 20 20 20 20  ite3_reset",    
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
c990: 74 5f 72 65 73 65 74 20 20 20 20 20 20 20 20 20  t_reset         
c9a0: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
c9b0: 6c 69 74 65 33 5f 73 74 65 70 22 2c 20 20 20 20  lite3_step",    
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
c9d0: 73 74 5f 73 74 65 70 2c 30 20 7d 2c 0a 0a 20 20  st_step,0 },..  
c9e0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f     /* sqlite3_co
c9f0: 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a  lumn_*() API */.
ca00: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
ca10: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20  column_count",  
ca20: 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
ca30: 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c  umn_count  ,0 },
ca40: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
ca50: 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20  _data_count",   
ca60: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 61           test_da
ca70: 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d  ta_count    ,0 }
ca80: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
ca90: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20  3_column_type", 
caa0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
cab0: 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20  olumn_type   ,0 
cac0: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
cad0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c  e3_column_blob",
cae0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
caf0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30  column_blob   ,0
cb00: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
cb10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
cb20: 65 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  e",         test
cb30: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c  _column_double ,
cb40: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
cb50: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
cb60: 34 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  4",          tes
cb70: 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20  t_column_int64  
cb80: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
cb90: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
cba0: 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  ", test_stmt_int
cbb0: 20 2c 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   ,sqlite3_column
cbc0: 5f 69 6e 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22  _int },.     { "
cbd0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
cbe0: 79 74 65 73 22 2c 20 74 65 73 74 5f 73 74 6d 74  ytes", test_stmt
cbf0: 5f 69 6e 74 20 2c 73 71 6c 69 74 65 33 5f 63 6f  _int ,sqlite3_co
cc00: 6c 75 6d 6e 5f 62 79 74 65 73 20 7d 2c 0a 20 20  lumn_bytes },.  
cc10: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
cc20: 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74  lumn_bytes16", t
cc30: 65 73 74 5f 73 74 6d 74 5f 69 6e 74 20 2c 73 71  est_stmt_int ,sq
cc40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
cc50: 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20 22  es16 },.     { "
cc60: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
cc70: 65 78 74 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  ext", test_stmt_
cc80: 75 74 66 38 2c 20 20 20 20 20 20 20 73 71 6c 69  utf8,       sqli
cc90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 7d  te3_column_text}
cca0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
ccb0: 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
ccc0: 65 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  e", test_stmt_ut
ccd0: 66 38 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  f8,   sqlite3_co
cce0: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a  lumn_decltype},.
ccf0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
cd00: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 74 65  column_name", te
cd10: 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 20  st_stmt_utf8,   
cd20: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
cd30: 6d 6e 5f 6e 61 6d 65 7d 2c 0a 20 20 20 20 20 7b  mn_name},.     {
cd40: 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
cd50: 5f 74 65 78 74 31 36 22 2c 20 74 65 73 74 5f 73  _text16", test_s
cd60: 74 6d 74 5f 75 74 66 31 36 2c 20 20 20 20 73 71  tmt_utf16,    sq
cd70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
cd80: 74 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  t16},.     { "sq
cd90: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
cda0: 6c 74 79 70 65 31 36 22 2c 20 74 65 73 74 5f 73  ltype16", test_s
cdb0: 74 6d 74 5f 75 74 66 31 36 2c 73 71 6c 69 74 65  tmt_utf16,sqlite
cdc0: 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
cdd0: 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  e16},.     { "sq
cde0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
cdf0: 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
ce00: 75 74 66 31 36 2c 20 20 20 20 73 71 6c 69 74 65  utf16,    sqlite
ce10: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d  3_column_name16}
ce20: 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74  ,..     /* Funct
ce30: 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a  ions from os.h *
ce40: 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  /.     { "sqlite
ce50: 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
ce60: 22 2c 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  ",test_sqlite3Os
ce70: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 2c 20 30  OpenReadWrite, 0
ce80: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
ce90: 74 65 33 4f 73 43 6c 6f 73 65 22 2c 20 20 20 20  te3OsClose",    
cea0: 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33      test_sqlite3
ceb0: 4f 73 43 6c 6f 73 65 2c 20 30 20 7d 2c 0a 20 20  OsClose, 0 },.  
cec0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 4c     { "sqlite3OsL
ced0: 6f 63 6b 22 2c 20 20 20 20 20 20 20 20 20 74 65  ock",         te
cee0: 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  st_sqlite3OsLock
cef0: 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
cf00: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 22 2c  qlite3OsUnlock",
cf10: 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69         test_sqli
cf20: 74 65 33 4f 73 55 6e 6c 6f 63 6b 2c 20 30 20 7d  te3OsUnlock, 0 }
cf30: 2c 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  ,..  };.  int i;
cf40: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
cf50: 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b 0a  lite3_os_trace;.
cf60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
cf70: 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f  zeof(aCmd)/sizeo
cf80: 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  f(aCmd[0]); i++)
cf90: 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
cfa0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
cfb0: 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  aCmd[i].zName, a
cfc0: 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c  Cmd[i].xProc, 0,
cfd0: 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69   0);.  }.  for(i
cfe0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62  =0; i<sizeof(aOb
cff0: 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62  jCmd)/sizeof(aOb
d000: 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  jCmd[0]); i++){.
d010: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
d020: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
d030: 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d   aObjCmd[i].zNam
d040: 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a  e, .        aObj
d050: 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f  Cmd[i].xProc, aO
d060: 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44  bjCmd[i].clientD
d070: 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54  ata, 0);.  }.  T
d080: 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
d090: 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63  p, "sqlite_searc
d0a0: 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  h_count", .     
d0b0: 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
d0c0: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54  _search_count, T
d0d0: 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
d0e0: 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
d0f0: 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65  rp, "sqlite_inte
d100: 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  rrupt_count", . 
d110: 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
d120: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
d130: 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
d140: 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
d150: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
d160: 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
d170: 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
d180: 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
d190: 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  _file_count, TCL
d1a0: 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
d1b0: 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
d1c0: 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  , "sqlite_curren
d1d0: 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20  t_time", .      
d1e0: 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
d1f0: 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43  current_time, TC
d200: 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
d210: 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
d220: 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72  p, "sqlite_os_tr
d230: 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ace",.      (cha
d240: 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
d250: 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
d260: 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
d270: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
d280: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
d290: 61 6c 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68  alue",.      (ch
d2a0: 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
d2b0: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54  ic_bind_value, T
d2c0: 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b  CL_LINK_STRING);
d2d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
d2e0: 3b 0a 7d 0a                                      ;.}.