/ Hex Artifact Content
Login

Artifact 0eca68f6e70069aad7ad0fd91fda886926646786:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 70  or testing the p
0190: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
01a0: 65 20 74 6f 20 53 51 4c 69 74 65 2e 20 20 54 68  e to SQLite.  Th
01b0: 69 73 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f  is code.** is no
01c0: 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  t included in th
01d0: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
01e0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 66 6f  .  It is used fo
01f0: 72 20 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74  r automated.** t
0200: 65 73 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51  esting of the SQ
0210: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a  Lite library..**
0220: 0a 2a 2a 20 24 49 64 3a 20 74 65 73 74 31 2e 63  .** $Id: test1.c
0230: 2c 76 20 31 2e 38 39 20 32 30 30 34 2f 30 36 2f  ,v 1.89 2004/06/
0240: 32 36 20 30 39 3a 35 30 3a 31 32 20 64 61 6e 69  26 09:50:12 dani
0250: 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f  elk1977 Exp $.*/
0260: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0270: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
0280: 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64   "tcl.h".#includ
0290: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
02a0: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
02b0: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
02c0: 0a 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 23 20 64  ..#if OS_WIN.# d
02d0: 65 66 69 6e 65 20 50 54 52 5f 46 4d 54 20 22 25  efine PTR_FMT "%
02e0: 78 22 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  x".#else.# defin
02f0: 65 20 50 54 52 5f 46 4d 54 20 22 25 70 22 0a 23  e PTR_FMT "%p".#
0300: 65 6e 64 69 66 0a 0a 69 6e 74 20 73 71 6c 69 74  endif..int sqlit
0310: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  e3_exec_printf(.
0320: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0340: 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62  /* An open datab
0350: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ase */.  const c
0360: 68 61 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c 20  har *sqlFormat, 
0370: 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66         /* printf
0380: 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74  -style format st
0390: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c  ring for the SQL
03a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 63 61 6c   */.  sqlite_cal
03b0: 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61 63 6b 2c  lback xCallback,
03c0: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
03d0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
03e0: 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  id *pArg,       
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
0400: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 63  st argument to c
0410: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
0420: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65 72 72   */.  char **err
0430: 6d 73 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  msg,            
0440: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67      /* Error msg
0450: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
0460: 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  .  ...          
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
0490: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
04a0: 6e 67 2e 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71  ng. */.);.int sq
04b0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
04c0: 70 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65  printf(.  sqlite
04d0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
04e0: 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61   /* An open data
04f0: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
0500: 63 68 61 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c  char *sqlFormat,
0510: 20 2f 2a 20 70 72 69 6e 74 66 2d 73 74 79 6c 65   /* printf-style
0520: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66   format string f
0530: 6f 72 20 74 68 65 20 53 51 4c 20 2a 2f 0a 20 20  or the SQL */.  
0540: 63 68 61 72 20 2a 2a 2a 72 65 73 75 6c 74 70 2c  char ***resultp,
0550: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
0560: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 63 68   written to a ch
0570: 61 72 20 2a 5b 5d 20 20 74 68 61 74 20 74 68 69  ar *[]  that thi
0580: 73 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20  s points to */. 
0590: 20 69 6e 74 20 2a 6e 72 6f 77 2c 20 20 20 20 20   int *nrow,     
05a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
05b0: 72 20 6f 66 20 72 65 73 75 6c 74 20 72 6f 77 73  r of result rows
05c0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
05d0: 0a 20 20 69 6e 74 20 2a 6e 63 6f 6c 2c 20 20 20  .  int *ncol,   
05e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
05f0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
0600: 6c 75 6d 6e 73 20 77 72 69 74 74 65 6e 20 68 65  lumns written he
0610: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65  re */.  char **e
0620: 72 72 6d 73 67 2c 20 20 20 20 20 20 20 20 20 2f  rrmsg,         /
0630: 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
0640: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 2e 2e  ten here */.  ..
0650: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0660: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
0670: 73 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20  s to the format 
0680: 73 74 72 69 6e 67 20 2a 2f 0a 29 3b 0a 0a 73 74  string */.);..st
0690: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
06a0: 2a 20 65 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20  * errorName(int 
06b0: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
06c0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
06d0: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
06e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
06f0: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
0700: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
0710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0720: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
0730: 52 52 4f 52 3a 20 20 20 20 20 20 7a 4e 61 6d 65  RROR:      zName
0740: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
0750: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0760: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0770: 49 4e 54 45 52 4e 41 4c 3a 20 20 20 7a 4e 61 6d  INTERNAL:   zNam
0780: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
0790: 52 4e 41 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b  RNAL";    break;
07a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
07b0: 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 7a 4e 61  _PERM:       zNa
07c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52  me = "SQLITE_PER
07d0: 4d 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  M";        break
07e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
07f0: 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 7a 4e  E_ABORT:      zN
0800: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
0810: 4f 52 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  ORT";       brea
0820: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0830: 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 7a  TE_BUSY:       z
0840: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
0850: 55 53 59 22 3b 20 20 20 20 20 20 20 20 62 72 65  USY";        bre
0860: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0870: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
0880: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0890: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 62 72  LOCKED";      br
08a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
08b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
08c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
08d0: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62  _NOMEM";       b
08e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
08f0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
0900: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0910: 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20  E_READONLY";    
0920: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0930: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
0940: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
0950: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
0960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0970: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
0980: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0990: 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20  ITE_IOERR";     
09a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
09b0: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
09c0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
09d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
09e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
09f0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
0a00: 4e 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ND:   zName = "S
0a10: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b  QLITE_NOTFOUND";
0a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0a30: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
0a40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0a50: 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20  SQLITE_FULL";   
0a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0a70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
0a80: 4f 50 45 4e 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OPEN:   zName = 
0a90: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
0aa0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
0ab0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
0ac0: 54 4f 43 4f 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d  TOCOL:   zName =
0ad0: 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
0ae0: 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
0af0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
0b00: 50 54 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  PTY:      zName 
0b10: 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22  = "SQLITE_EMPTY"
0b20: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
0b30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
0b40: 43 48 45 4d 41 3a 20 20 20 20 20 7a 4e 61 6d 65  CHEMA:     zName
0b50: 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d   = "SQLITE_SCHEM
0b60: 41 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A";      break;.
0b70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0b80: 54 4f 4f 42 49 47 3a 20 20 20 20 20 7a 4e 61 6d  TOOBIG:     zNam
0b90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42  e = "SQLITE_TOOB
0ba0: 49 47 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  IG";      break;
0bb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0bc0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 4e 61  _CONSTRAINT: zNa
0bd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
0be0: 53 54 52 41 49 4e 54 22 3b 20 20 62 72 65 61 6b  STRAINT";  break
0bf0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0c00: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 7a 4e  E_MISMATCH:   zN
0c10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
0c20: 53 4d 41 54 43 48 22 3b 20 20 20 20 62 72 65 61  SMATCH";    brea
0c30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0c40: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 7a  TE_MISUSE:     z
0c50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
0c60: 49 53 55 53 45 22 3b 20 20 20 20 20 20 62 72 65  ISUSE";      bre
0c70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0c80: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
0c90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0ca0: 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 62 72  NOLFS";       br
0cb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0cc0: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
0cd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0ce0: 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 62  _AUTH";        b
0cf0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0d00: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
0d10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0d20: 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20  E_FORMAT";      
0d30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0d40: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
0d50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0d60: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
0d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0d80: 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20   SQLITE_ROW:    
0d90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0da0: 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20  ITE_ROW";       
0db0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0dc0: 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20  e SQLITE_DONE:  
0dd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0de0: 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20  LITE_DONE";     
0df0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
0e00: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
0e10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0e20: 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22 3b 20  QLITE_Unknown"; 
0e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
0e40: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
0e50: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
0e60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
0e70: 71 6c 69 74 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  qlite object..*/
0e80: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 44  .static int getD
0e90: 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74  bPointer(Tcl_Int
0ea0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e  erp *interp, con
0eb0: 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 73 71 6c  st char *zA, sql
0ec0: 69 74 65 20 2a 2a 70 70 44 62 29 7b 0a 20 20 69  ite **ppDb){.  i
0ed0: 66 28 20 73 73 63 61 6e 66 28 7a 41 2c 20 50 54  f( sscanf(zA, PT
0ee0: 52 5f 46 4d 54 2c 20 28 76 6f 69 64 2a 2a 29 70  R_FMT, (void**)p
0ef0: 70 44 62 29 21 3d 31 20 26 26 20 0a 20 20 20 20  pDb)!=1 && .    
0f00: 20 20 28 7a 41 5b 30 5d 21 3d 27 30 27 20 7c 7c    (zA[0]!='0' ||
0f10: 20 7a 41 5b 31 5d 21 3d 27 78 27 20 7c 7c 20 73   zA[1]!='x' || s
0f20: 73 63 61 6e 66 28 26 7a 41 5b 32 5d 2c 20 50 54  scanf(&zA[2], PT
0f30: 52 5f 46 4d 54 2c 20 28 76 6f 69 64 2a 2a 29 70  R_FMT, (void**)p
0f40: 70 44 62 29 21 3d 31 29 0a 20 20 29 7b 0a 20 20  pDb)!=1).  ){.  
0f50: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
0f60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 5c 22 22 2c  lt(interp, "\"",
0f70: 20 7a 41 2c 20 22 5c 22 20 69 73 20 6e 6f 74 20   zA, "\" is not 
0f80: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 20  a valid pointer 
0f90: 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20  value", 0);.    
0fa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0fb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0fc0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
0fd0: 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65 72  Decode a pointer
0fe0: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 73   to an sqlite3_s
0ff0: 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  tmt object..*/.s
1000: 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 74 6d  tatic int getStm
1010: 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63 6c 5f  tPointer(.  Tcl_
1020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1030: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1040: 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  Arg,  .  sqlite3
1050: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29  _stmt **ppStmt.)
1060: 7b 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28 7a  {.  if( sscanf(z
1070: 41 72 67 2c 20 50 54 52 5f 46 4d 54 2c 20 28 76  Arg, PTR_FMT, (v
1080: 6f 69 64 2a 2a 29 70 70 53 74 6d 74 29 21 3d 31  oid**)ppStmt)!=1
1090: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
10a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10b0: 20 22 5c 22 22 2c 20 7a 41 72 67 2c 20 22 5c 22   "\"", zArg, "\"
10c0: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
10d0: 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 22 2c 20  pointer value", 
10e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1100: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1110: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
1120: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
1130: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65  qlite3_stmt obje
1140: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
1150: 74 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  t getFilePointer
1160: 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  (.  Tcl_Interp *
1170: 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74  interp, .  const
1180: 20 63 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20   char *zArg,  . 
1190: 20 4f 73 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65   OsFile **ppFile
11a0: 0a 29 7b 0a 20 20 69 66 28 20 73 73 63 61 6e 66  .){.  if( sscanf
11b0: 28 7a 41 72 67 2c 20 50 54 52 5f 46 4d 54 2c 20  (zArg, PTR_FMT, 
11c0: 28 76 6f 69 64 2a 2a 29 70 70 46 69 6c 65 29 21  (void**)ppFile)!
11d0: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =1 ){.    Tcl_Ap
11e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11f0: 70 2c 20 22 5c 22 22 2c 20 7a 41 72 67 2c 20 22  p, "\"", zArg, "
1200: 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  \" is not a vali
1210: 64 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 22  d pointer value"
1220: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1230: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1240: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1250: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1260: 74 65 20 61 20 74 65 78 74 20 72 65 70 72 65 73  te a text repres
1270: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f  entation of a po
1280: 69 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  inter that can b
1290: 65 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20  e understood.** 
12a0: 62 79 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e  by the getDbPoin
12b0: 74 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69  ter and getVmPoi
12c0: 6e 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62  nter routines ab
12d0: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ove..**.** The p
12e0: 72 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f  roblem is, on so
12f0: 6d 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c  me machines (Sol
1300: 61 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20  aris) if you do 
1310: 61 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a  a printf with.**
1320: 20 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74   "%p" you cannot
1330: 20 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64   turn around and
1340: 20 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68   do a scanf with
1350: 20 74 68 65 20 73 61 6d 65 20 22 25 70 22 20 61   the same "%p" a
1360: 6e 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70  nd.** get your p
1370: 6f 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f  ointer back.  Yo
1380: 75 20 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e  u have to prepen
1390: 64 20 61 20 22 30 78 22 20 62 65 66 6f 72 65 20  d a "0x" before 
13a0: 69 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e  it will.** work.
13b0: 20 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68    Or at least th
13c0: 61 74 20 69 73 20 77 68 61 74 20 69 73 20 72 65  at is what is re
13d0: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72  ported to me (dr
13e0: 68 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a  h).  But this.**
13f0: 20 62 65 68 61 76 69 6f 72 20 76 61 72 69 65 73   behavior varies
1400: 20 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f   from machine to
1410: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73   machine.  The s
1420: 6f 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72  olution used her
1430: 20 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74   is.** to test t
1440: 68 65 20 73 74 72 69 6e 67 20 72 69 67 68 74 20  he string right 
1450: 61 66 74 65 72 20 69 74 20 69 73 20 67 65 6e 65  after it is gene
1460: 72 61 74 65 64 20 74 6f 20 73 65 65 20 69 66 20  rated to see if 
1470: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64  it can be.** und
1480: 65 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66  erstood by scanf
1490: 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72  , and if not, tr
14a0: 79 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20  y prepending an 
14b0: 22 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a  "0x" to see if.*
14c0: 2a 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49  * that helps.  I
14d0: 66 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c  f nothing works,
14e0: 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69   a fatal error i
14f0: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
1500: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 50  static int makeP
1510: 6f 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e  ointerStr(Tcl_In
1520: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68  terp *interp, ch
1530: 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a  ar *zPtr, void *
1540: 70 29 7b 0a 20 20 76 6f 69 64 20 2a 70 32 3b 0a  p){.  void *p2;.
1550: 20 20 73 70 72 69 6e 74 66 28 7a 50 74 72 2c 20    sprintf(zPtr, 
1560: 50 54 52 5f 46 4d 54 2c 20 70 29 3b 0a 20 20 69  PTR_FMT, p);.  i
1570: 66 28 20 73 73 63 61 6e 66 28 7a 50 74 72 2c 20  f( sscanf(zPtr, 
1580: 50 54 52 5f 46 4d 54 2c 20 26 70 32 29 21 3d 31  PTR_FMT, &p2)!=1
1590: 20 7c 7c 20 70 32 21 3d 70 20 29 7b 0a 20 20 20   || p2!=p ){.   
15a0: 20 73 70 72 69 6e 74 66 28 7a 50 74 72 2c 20 22   sprintf(zPtr, "
15b0: 30 78 22 20 50 54 52 5f 46 4d 54 2c 20 70 29 3b  0x" PTR_FMT, p);
15c0: 0a 20 20 20 20 69 66 28 20 73 73 63 61 6e 66 28  .    if( sscanf(
15d0: 7a 50 74 72 2c 20 50 54 52 5f 46 4d 54 2c 20 26  zPtr, PTR_FMT, &
15e0: 70 32 29 21 3d 31 20 7c 7c 20 70 32 21 3d 70 20  p2)!=1 || p2!=p 
15f0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
1600: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1610: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  , "unable to con
1620: 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74  vert a pointer t
1630: 6f 20 61 20 73 74 72 69 6e 67 20 22 0a 20 20 20  o a string ".   
1640: 20 20 20 20 20 20 22 69 6e 20 74 68 65 20 66 69        "in the fi
1650: 6c 65 20 22 20 5f 5f 46 49 4c 45 5f 5f 20 22 20  le " __FILE__ " 
1660: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 61 6b 65  in function make
1670: 50 6f 69 6e 74 65 72 53 74 72 28 29 2e 20 20 50  PointerStr().  P
1680: 6c 65 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  lease ".        
1690: 20 22 72 65 70 6f 72 74 20 74 68 69 73 20 70 72   "report this pr
16a0: 6f 62 6c 65 6d 20 74 6f 20 74 68 65 20 53 51 4c  oblem to the SQL
16b0: 69 74 65 20 6d 61 69 6c 69 6e 67 20 6c 69 73 74  ite mailing list
16c0: 20 6f 72 20 61 73 20 61 20 6e 65 77 20 62 75 74   or as a new but
16d0: 20 22 0a 20 20 20 20 20 20 20 20 20 22 72 65 70   ".         "rep
16e0: 6f 72 74 2e 20 20 50 6c 65 61 73 65 20 70 72 6f  ort.  Please pro
16f0: 76 69 64 65 20 64 65 74 61 69 6c 65 64 20 69 6e  vide detailed in
1700: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1710: 68 6f 77 20 79 6f 75 20 63 6f 6d 70 69 6c 65 64  how you compiled
1720: 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 51 4c   ".         "SQL
1730: 69 74 65 20 61 6e 64 20 77 68 61 74 20 63 6f 6d  ite and what com
1740: 70 75 74 65 72 20 79 6f 75 20 61 72 65 20 72 75  puter you are ru
1750: 6e 6e 69 6e 67 20 6f 6e 2e 22 2c 20 30 29 3b 0a  nning on.", 0);.
1760: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
1770: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1780: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1790: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
17a0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
17b0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 65 78 65   for sqlite3_exe
17c0: 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73  c_printf()..*/.s
17d0: 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 5f 70  tatic int exec_p
17e0: 72 69 6e 74 66 5f 63 62 28 76 6f 69 64 20 2a 70  rintf_cb(void *p
17f0: 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  Arg, int argc, c
1800: 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72  har **argv, char
1810: 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f   **name){.  Tcl_
1820: 44 53 74 72 69 6e 67 20 2a 73 74 72 20 3d 20 28  DString *str = (
1830: 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70 41 72  Tcl_DString*)pAr
1840: 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  g;.  int i;..  i
1850: 66 28 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65  f( Tcl_DStringLe
1860: 6e 67 74 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a  ngth(str)==0 ){.
1870: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
1880: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
1890: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
18a0: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e  ndElement(str, n
18b0: 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d  ame[i] ? name[i]
18c0: 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20   : "NULL");.    
18d0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
18e0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
18f0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1900: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c  pendElement(str,
1910: 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b   argv[i] ? argv[
1920: 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  i] : "NULL");.  
1930: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1940: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1950: 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e  qlite3_exec_prin
1960: 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20  tf  DB  FORMAT  
1970: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76  STRING.**.** Inv
1980: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
1990: 65 78 65 63 5f 70 72 69 6e 74 66 28 29 20 69 6e  exec_printf() in
19a0: 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68  terface using th
19b0: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
19c0: 2a 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c 20  ** DB.  The SQL 
19d0: 69 73 20 74 68 65 20 73 74 72 69 6e 67 20 46 4f  is the string FO
19e0: 52 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d 61  RMAT.  The forma
19f0: 74 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20  t string should 
1a00: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25  contain.** one %
1a10: 73 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e 47  s or %q.  STRING
1a20: 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e   is the value in
1a30: 73 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20 6f  serted into %s o
1a40: 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  r %q..*/.static 
1a50: 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 70 72  int test_exec_pr
1a60: 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  intf(.  void *No
1a70: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
1a80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1a90: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1aa0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1ab0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1ac0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1af0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
1b00: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
1b10: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
1b20: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
1b30: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 54   sqlite *db;.  T
1b40: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
1b50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1b60: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
1b70: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69  ar zBuf[30];.  i
1b80: 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20  f( argc!=4 ){.  
1b90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ba0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1bb0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1bc0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1bd0: 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46  , .       " DB F
1be0: 4f 52 4d 41 54 20 53 54 52 49 4e 47 22 2c 20 30  ORMAT STRING", 0
1bf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1c10: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1c20: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1c30: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1c40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
1c50: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
1c60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c70: 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 64 62  3_exec_printf(db
1c80: 2c 20 61 72 67 76 5b 32 5d 2c 20 65 78 65 63 5f  , argv[2], exec_
1c90: 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c  printf_cb, &str,
1ca0: 20 26 7a 45 72 72 2c 20 61 72 67 76 5b 33 5d 29   &zErr, argv[3])
1cb0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
1cc0: 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54  , "%d", rc);.  T
1cd0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
1ce0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
1cf0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
1d00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d  ent(interp, rc==
1d10: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f  SQLITE_OK ? Tcl_
1d20: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
1d30: 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63  r) : zErr);.  Tc
1d40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
1d50: 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  tr);.  if( zErr 
1d60: 29 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  ) free(zErr);.  
1d70: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1d80: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1d90: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1da0: 7a 5f 74 65 73 74 20 20 53 45 50 41 52 41 54 4f  z_test  SEPARATO
1db0: 52 20 20 41 52 47 30 20 20 41 52 47 31 20 2e 2e  R  ARG0  ARG1 ..
1dc0: 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ..**.** Test the
1dd0: 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66 20 6d 70   %z format of mp
1de0: 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75  rintf().  Use mu
1df0: 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29  ltiple mprintf()
1e00: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f   calls to .** co
1e10: 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30 20 74  ncatenate arg0 t
1e20: 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e  hrough argn usin
1e30: 67 20 73 65 70 61 72 61 74 6f 72 20 61 73 20 74  g separator as t
1e40: 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a  he separator..**
1e50: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
1e60: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
1e70: 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a  t test_mprintf_z
1e80: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1e90: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1ea0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1eb0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1ec0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1ed0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1ee0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1f10: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f30: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1f40: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ment */.){.  cha
1f50: 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a  r *zResult = 0;.
1f60: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
1f70: 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=2; i<argc; i++
1f80: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  ){.    zResult =
1f90: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1fa0: 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73 75 6c  "%z%s%s", zResul
1fb0: 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 76  t, argv[1], argv
1fc0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  [i]);.  }.  Tcl_
1fd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1fe0: 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20 30 29  erp, zResult, 0)
1ff0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
2000: 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72  Result);.  retur
2010: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2020: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
2030: 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
2040: 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20  ntf  DB  FORMAT 
2050: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e   STRING.**.** In
2060: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
2070: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
2080: 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 75 73  f() interface us
2090: 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ing the open dat
20a0: 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68  abase.** DB.  Th
20b0: 65 20 53 51 4c 20 69 73 20 74 68 65 20 73 74 72  e SQL is the str
20c0: 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65  ing FORMAT.  The
20d0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73   format string s
20e0: 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
20f0: 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20   one %s or %q.  
2100: 53 54 52 49 4e 47 20 69 73 20 74 68 65 20 76 61  STRING is the va
2110: 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  lue inserted int
2120: 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73  o %s or %q..*/.s
2130: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
2140: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28  et_table_printf(
2150: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
2160: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2170: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2180: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2190: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
21a0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
21b0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
21c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21d0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
21e0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
21f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2200: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
2210: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
2220: 74 65 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  te *db;.  Tcl_DS
2230: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2240: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2250: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f  r = 0;.  int nRo
2260: 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  w, nCol;.  char 
2270: 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  **aResult;.  int
2280: 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   i;.  char zBuf[
2290: 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21  30];.  if( argc!
22a0: 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
22b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
22c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
22d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
22e0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
22f0: 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54    " DB FORMAT ST
2300: 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72  RING", 0);.    r
2310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2320: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2330: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2340: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
2350: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2360: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ;.  Tcl_DStringI
2370: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 72 63 20  nit(&str);.  rc 
2380: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
2390: 62 6c 65 5f 70 72 69 6e 74 66 28 64 62 2c 20 61  ble_printf(db, a
23a0: 72 67 76 5b 32 5d 2c 20 26 61 52 65 73 75 6c 74  rgv[2], &aResult
23b0: 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c 20  , &nRow, &nCol, 
23c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d0: 26 7a 45 72 72 2c 20 61 72 67 76 5b 33 5d 29 3b  &zErr, argv[3]);
23e0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
23f0: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
2400: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
2410: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
2420: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2430: 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  OK ){.    sprint
2440: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52  f(zBuf, "%d", nR
2450: 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ow);.    Tcl_App
2460: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2470: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 73 70  p, zBuf);.    sp
2480: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
2490: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 54 63 6c  , nCol);.    Tcl
24a0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
24b0: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
24c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 52    for(i=0; i<(nR
24d0: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69 2b 2b 29  ow+1)*nCol; i++)
24e0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
24f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2500: 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20 61  , aResult[i] ? a
2510: 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55 4c  Result[i] : "NUL
2520: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  L");.    }.  }el
2530: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  se{.    Tcl_Appe
2540: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2550: 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  , zErr);.  }.  s
2560: 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c  qlite3_free_tabl
2570: 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69 66  e(aResult);.  if
2580: 28 20 7a 45 72 72 20 29 20 66 72 65 65 28 7a 45  ( zErr ) free(zE
2590: 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rr);.  return TC
25a0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
25b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
25c0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
25d0: 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  d DB.**.** Retur
25e0: 6e 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 52  ns the integer R
25f0: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
2600: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a   recent insert..
2610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2620: 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20  st_last_rowid(. 
2630: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2640: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2650: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2660: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2670: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2680: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2690: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
26a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26b0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
26c0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
26d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
26e0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
26f0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
2700: 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75   *db;.  char zBu
2710: 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[30];..  if( ar
2720: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
2730: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2740: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2750: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2760: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
2770: 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  B\"", 0);.    re
2780: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2790: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
27a0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
27b0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
27c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27d0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
27e0: 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33   "%lld", sqlite3
27f0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
2800: 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  id(db));.  Tcl_A
2810: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2820: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
2830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
2850: 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  :  sqlite3_close
2860: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73   DB.**.** Closes
2870: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
2880: 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ened by sqlite3_
2890: 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  open..*/.static 
28a0: 69 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f  int sqlite_test_
28b0: 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e  close(.  void *N
28c0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
28d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
28e0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
28f0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2900: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2910: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2930: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2940: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2950: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2960: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2970: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2980: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
2990: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
29a0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
29b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
29c0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
29d0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
29e0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
29f0: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
2a00: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2a10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a20: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2a30: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2a40: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2a50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a60: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
2a70: 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  se(db);.  Tcl_Se
2a80: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2a90: 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d  (char *)errorNam
2aa0: 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
2ab0: 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
2ac0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
2ad0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2ae0: 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28 29  the x_coalesce()
2af0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65   function..** Re
2b00: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 61  turn the first a
2b10: 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c  rgument non-NULL
2b20: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
2b30: 61 74 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c  atic void ifnull
2b40: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
2b50: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
2b60: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
2b70: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
2b80: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2b90: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
2ba0: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
2bb0: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
2bc0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69  alue_type(argv[i
2bd0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ]) ){.      sqli
2be0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
2bf0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
2c00: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
2c10: 5b 69 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20  [i]), -1,.      
2c20: 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53      SQLITE_TRANS
2c30: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
2c40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
2c50: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
2c60: 72 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f  re into which to
2c70: 20 61 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74   accumulate text
2c80: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72  ..*/.struct dstr
2c90: 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b   {.  int nAlloc;
2ca0: 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
2cb0: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  ated */.  int nU
2cc0: 73 65 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20  sed;   /* Space 
2cd0: 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  used */.  char *
2ce0: 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70  z;     /* The sp
2cf0: 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ace */.};../*.**
2d00: 20 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20   Append text to 
2d10: 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63  a dstr.*/.static
2d20: 20 76 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64   void dstrAppend
2d30: 28 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c  (struct dstr *p,
2d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
2d50: 69 6e 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20  int divider){.  
2d60: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
2d70: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65  );.  if( p->nUse
2d80: 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e  d + n + 2 > p->n
2d90: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61  Alloc ){.    cha
2da0: 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e  r *zNew;.    p->
2db0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c  nAlloc = p->nAll
2dc0: 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a  oc*2 + n + 200;.
2dd0: 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74      zNew = sqlit
2de0: 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70  eRealloc(p->z, p
2df0: 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  ->nAlloc);.    i
2e00: 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( zNew==0 ){.  
2e10: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2e20: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ->z);.      mems
2e30: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
2e40: 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *p));.      retu
2e50: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
2e60: 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20  >z = zNew;.  }. 
2e70: 20 69 66 28 20 64 69 76 69 64 65 72 20 26 26 20   if( divider && 
2e80: 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20  p->nUsed>0 ){.  
2e90: 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b    p->z[p->nUsed+
2ea0: 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20  +] = divider;.  
2eb0: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a  }.  memcpy(&p->z
2ec0: 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e  [p->nUsed], z, n
2ed0: 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20  +1);.  p->nUsed 
2ee0: 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  += n;.}../*.** I
2ef0: 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20  nvoked for each 
2f00: 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71  callback from sq
2f10: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f  lite3ExecFunc.*/
2f20: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
2f30: 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69  FuncCallback(voi
2f40: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72  d *pData, int ar
2f50: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
2f60: 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29   char **NotUsed)
2f70: 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20  {.  struct dstr 
2f80: 2a 70 20 3d 20 28 73 74 72 75 63 74 20 64 73 74  *p = (struct dst
2f90: 72 2a 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20  r*)pData;.  int 
2fa0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
2fb0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
2fc0: 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29  if( argv[i]==0 )
2fd0: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
2fe0: 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20  nd(p, "NULL", ' 
2ff0: 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ');.    }else{. 
3000: 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28       dstrAppend(
3010: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29  p, argv[i], ' ')
3020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3030: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3040: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
3050: 6f 66 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f  of the x_sqlite_
3060: 65 78 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e  exec() function.
3070: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
3080: 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c  takes.** a singl
3090: 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61  e argument and a
30a0: 74 74 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75  ttempts to execu
30b0: 74 65 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  te that argument
30c0: 20 61 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a   as SQL code..**
30d0: 20 54 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c   This is illegal
30e0: 20 61 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20   and should set 
30f0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
3100: 45 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61  E flag on the da
3110: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  tabase..**.** 20
3120: 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68  04-Jan-07:  We h
3130: 61 76 65 20 63 68 61 6e 67 65 64 20 74 68 69 73  ave changed this
3140: 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61   to make it lega
3150: 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
3160: 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d  3_exec().** from
3170: 20 77 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69   within a functi
3180: 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a  on call.  .** .*
3190: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
31a0: 69 6d 75 6c 61 74 65 73 20 74 68 65 20 65 66 66  imulates the eff
31b0: 65 63 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77  ect of having tw
31c0: 6f 20 74 68 72 65 61 64 73 20 61 74 74 65 6d 70  o threads attemp
31d0: 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20  t to.** use the 
31e0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 61 74  same database at
31f0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
3200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3210: 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a  qlite3ExecFunc(.
3220: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3230: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
3240: 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c  nt argc,  .  sql
3250: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3260: 76 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  v.){.  struct ds
3270: 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26  tr x;.  memset(&
3280: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
3290: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ;.  sqlite3_exec
32a0: 28 28 73 71 6c 69 74 65 2a 29 73 71 6c 69 74 65  ((sqlite*)sqlite
32b0: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
32c0: 65 78 74 29 2c 0a 20 20 20 20 20 20 73 71 6c 69  ext),.      sqli
32d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
32e0: 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65  rgv[0]),.      e
32f0: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c  xecFuncCallback,
3300: 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   &x, 0);.  sqlit
3310: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
3320: 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e  ontext, x.z, x.n
3330: 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41  Used, SQLITE_TRA
3340: 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
3350: 65 46 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f  eFree(x.z);.}../
3360: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
3370: 69 74 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f  ite_test_create_
3380: 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a  function DB.**.*
3390: 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74  * Call the sqlit
33a0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
33b0: 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69  on API on the gi
33c0: 76 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20  ven database in 
33d0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61  order.** to crea
33e0: 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61  te a function na
33f0: 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22  med "x_coalesce"
3400: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
3410: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74   does the same t
3420: 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22  hing.** as the "
3430: 63 6f 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69  coalesce" functi
3440: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
3450: 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72  on also register
3460: 73 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  s an SQL functio
3470: 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71  n.** named "x_sq
3480: 6c 69 74 65 5f 65 78 65 63 22 20 74 68 61 74 20  lite_exec" that 
3490: 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f  invokes sqlite3_
34a0: 65 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e  exec().  Invokin
34b0: 67 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  g sqlite3_exec()
34c0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20  .** in this way 
34d0: 69 73 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72  is illegal recur
34e0: 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20  sion and should 
34f0: 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f  raise an SQLITE_
3500: 4d 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a  MISUSE error..**
3510: 20 54 68 65 20 65 66 66 65 63 74 20 69 73 20 73   The effect is s
3520: 69 6d 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67  imilar to trying
3530: 20 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65   to use the same
3540: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
3550: 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  tion from.** two
3560: 20 74 68 72 65 61 64 73 20 61 74 20 74 68 65 20   threads at the 
3570: 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  same time..**.**
3580: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f   The original mo
3590: 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  tivation for thi
35a0: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f  s routine was to
35b0: 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c   be able to call
35c0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
35d0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
35e0: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61  function while a
35f0: 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f   query is in pro
3600: 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a  gress in order.*
3610: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51  * to test the SQ
3620: 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65  LITE_MISUSE dete
3630: 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  ction logic..*/.
3640: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3650: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
3660: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3670: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3680: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3690: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
36a0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
36b0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
36c0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
36d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36e0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
36f0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3710: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3720: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
3730: 74 65 20 2a 64 62 3b 0a 20 20 65 78 74 65 72 6e  te *db;.  extern
3740: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
3750: 65 72 28 73 71 6c 69 74 65 2a 29 3b 0a 20 20 69  er(sqlite*);.  i
3760: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
3770: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3780: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
3790: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
37a0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
37b0: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
37c0: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
37d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
37e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
37f0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3800: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3810: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3820: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  R;.  sqlite3_cre
3830: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
3840: 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d   "x_coalesce", -
3850: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
3860: 30 2c 20 0a 20 20 20 20 20 20 69 66 6e 75 6c 6c  0, .      ifnull
3870: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73  Func, 0, 0);.  s
3880: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
3890: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 73 71  nction(db, "x_sq
38a0: 6c 69 74 65 5f 65 78 65 63 22 2c 20 31 2c 20 53  lite_exec", 1, S
38b0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 64 62 2c 0a  QLITE_UTF8, db,.
38c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 65        sqlite3Exe
38d0: 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  cFunc, 0, 0);.  
38e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
38f0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
3900: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
3910: 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72  e x_count() aggr
3920: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  egate function..
3930: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3940: 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74  t CountCtx Count
3950: 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e  Ctx;.struct Coun
3960: 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  tCtx {.  int n;.
3970: 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  };.static void c
3980: 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65 33  ountStep(sqlite3
3990: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
39a0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
39b0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
39c0: 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a  v){.  CountCtx *
39d0: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
39e0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
39f0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
3a00: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28  of(*p));.  if( (
3a10: 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54  argc==0 || SQLIT
3a20: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
3a30: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
3a40: 30 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20  0]) ) && p ){.  
3a50: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20    p->n++;.  }.} 
3a60: 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63    .static void c
3a70: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ountFinalize(sql
3a80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3a90: 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43  ntext){.  CountC
3aa0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
3ab0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3ac0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
3ad0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73  sizeof(*p));.  s
3ae0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
3af0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70  t(context, p ? p
3b00: 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ->n : 0);.}../*.
3b10: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
3b20: 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  e_test_create_ag
3b30: 67 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a  gregate DB.**.**
3b40: 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
3b50: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
3b60: 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76  n API on the giv
3b70: 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  en database in o
3b80: 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74  rder.** to creat
3b90: 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  e a function nam
3ba0: 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54  ed "x_count".  T
3bb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
3bc0: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
3bd0: 0a 2a 2a 20 61 73 20 74 68 65 20 22 6d 64 35 73  .** as the "md5s
3be0: 75 6d 22 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  um" function..**
3bf0: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
3c00: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
3c10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
3c20: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
3c30: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
3c40: 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  e3_create_aggreg
3c50: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  ate function whi
3c60: 6c 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e  le a query is in
3c70: 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64   progress in ord
3c80: 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68  er.** to test th
3c90: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
3ca0: 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e  detection logic.
3cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
3cc0: 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65  est_create_aggre
3cd0: 67 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  gate(.  void *No
3ce0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3cf0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3d00: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
3d10: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
3d20: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
3d30: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d50: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
3d60: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3d70: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3d80: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3d90: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3da0: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 69   sqlite *db;.  i
3db0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
3dc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3dd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
3de0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
3df0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
3e00: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
3e10: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
3e20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3e30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
3e40: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3e50: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3e60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3e70: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  R;.  sqlite3_cre
3e80: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
3e90: 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53   "x_count", 0, S
3ea0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
3eb0: 2c 0a 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65  ,.      countSte
3ec0: 70 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29  p,countFinalize)
3ed0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
3ee0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
3ef0: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
3f00: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
3f10: 0a 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65 70  .      countStep
3f20: 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b  ,countFinalize);
3f30: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3f40: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  ;.}..../*.** Usa
3f50: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3f60: 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20  intf_int FORMAT 
3f70: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
3f80: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61  INTEGER.**.** Ca
3f90: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
3fa0: 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61 72  three integer ar
3fb0: 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  guments.*/.stati
3fc0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
3fd0: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
3fe0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3ff0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4000: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4010: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4020: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4030: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
4040: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4060: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4070: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4080: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4090: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
40a0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
40b0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
40c0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
40d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
40e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
40f0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4100: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4110: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
4120: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
4130: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4140: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4150: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
4160: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
4170: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
4180: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
4190: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
41a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
41b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
41c0: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
41d0: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
41e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
41f0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
4200: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4210: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
4220: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4230: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
4240: 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41  intf_int64 FORMA
4250: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
4260: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
4270: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
4280: 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69  h three 64-bit i
4290: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
42a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
42b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
42c0: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  nt64(.  void *No
42d0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
42e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
42f0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4300: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4310: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4320: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4340: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4350: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4360: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4370: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4380: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4390: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
43a0: 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63  _int64 a[3];.  c
43b0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
43c0: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
43d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
43e0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
43f0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4400: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4410: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
4420: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
4430: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4440: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
4450: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
4460: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
4470: 33 47 65 74 49 6e 74 36 34 28 61 72 67 76 5b 69  3GetInt64(argv[i
4480: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a 20  ], &a[i-2]) ){. 
4490: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
44a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
44b0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  rgument is not a
44c0: 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e   valid 64-bit in
44d0: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
44e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
44f0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
4500: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
4510: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
4520: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
4530: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4540: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
4550: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4560: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
4570: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
4580: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
4590: 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41  printf_str FORMA
45a0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
45b0: 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  R STRING.**.** C
45c0: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
45d0: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
45e0: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73  uments and one s
45f0: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a  tring argument.*
4600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
4610: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
4620: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4630: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4640: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4650: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4660: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4670: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4680: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
46a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
46b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
46d0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
46e0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
46f0: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72   a[3], i;.  char
4700: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
4710: 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20  4 || argc>5 ){. 
4720: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4730: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4740: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4750: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4760: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
4770: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
4780: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
4790: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
47a0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
47b0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
47c0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
47d0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
47e0: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
47f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4800: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
4810: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
4820: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
4830: 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e  >4 ? argv[4] : N
4840: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
4850: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4860: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
4870: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
4880: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4890: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
48a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
48b0: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
48c0: 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a  INTEGER DOUBLE.*
48d0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
48e0: 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67  f with two integ
48f0: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  er arguments and
4900: 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75   one double argu
4910: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ment.*/.static i
4920: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
4930: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
4940: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4950: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4960: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4970: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4980: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4990: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
49a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
49b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
49c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
49d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
49e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
49f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4a00: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
4a10: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
4a20: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
4a30: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
4a40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4a50: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4a60: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4a70: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
4a80: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
4a90: 4e 54 20 49 4e 54 20 53 54 52 49 4e 47 5c 22 22  NT INT STRING\""
4aa0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4ab0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4ac0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
4ad0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
4ae0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
4af0: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
4b00: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
4b10: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4b20: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
4b30: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
4b40: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
4b50: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
4b60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
4b70: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
4b80: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
4b90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4ba0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
4bb0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
4bc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4bd0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4be0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
4bf0: 72 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20  r FORMAT DOUBLE 
4c00: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
4c10: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61  l mprintf with a
4c20: 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61   single double a
4c30: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
4c40: 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20   the product of 
4c50: 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d  the.** two argum
4c60: 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65  ents given above
4c70: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4c80: 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72  to generate over
4c90: 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c  flow and underfl
4ca0: 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f  ow.** doubles to
4cb0: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20   test that they 
4cc0: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72  are converted pr
4cd0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  operly..*/.stati
4ce0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
4cf0: 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20  rintf_scaled(.  
4d00: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4d10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4d20: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4d30: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4d40: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4d50: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4d60: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4d70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4d80: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
4d90: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4da0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4db0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4dc0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
4dd0: 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20    double r[2];. 
4de0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
4df0: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
4e00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4e10: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4e20: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4e30: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
4e40: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44        " FORMAT D
4e50: 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c  OUBLE DOUBLE\"",
4e60: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4e70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4e80: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
4e90: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
4ea0: 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72  _GetDouble(inter
4eb0: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69  p, argv[i], &r[i
4ec0: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
4ed0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
4ee0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4ef0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d  tf(argv[1], r[0]
4f00: 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70  *r[1]);.  Tcl_Ap
4f10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4f20: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
4f30: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
4f40: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
4f50: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
4f60: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
4f70: 20 4e 0a 2a 2a 0a 2a 2a 20 52 69 67 20 73 71 6c   N.**.** Rig sql
4f80: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 74 6f 20 66  iteMalloc() to f
4f90: 61 69 6c 20 6f 6e 20 74 68 65 20 4e 2d 74 68 20  ail on the N-th 
4fa0: 63 61 6c 6c 2e 20 20 54 75 72 6e 20 6f 66 66 20  call.  Turn off 
4fb0: 74 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  this mechanism.*
4fc0: 2a 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  * and reset the 
4fd0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
4fe0: 61 69 6c 65 64 20 76 61 72 69 61 62 6c 65 20 69  ailed variable i
4ff0: 73 20 4e 3d 3d 30 2e 0a 2a 2f 0a 23 69 66 64 65  s N==0..*/.#ifde
5000: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
5010: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
5020: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 28 0a 20 20  _malloc_fail(.  
5030: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
5040: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5050: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
5060: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
5070: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
5080: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
5090: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
50a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
50b0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
50c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
50d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
50e0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
50f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
5100: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
5110: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
5120: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
5130: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
5140: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
5150: 5b 30 5d 2c 20 22 20 4e 5c 22 22 2c 20 30 29 3b  [0], " N\"", 0);
5160: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
5180: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
5190: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29  rp, argv[1], &n)
51a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
51b0: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ROR;.  sqlite3_i
51c0: 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6e 3b 0a  MallocFail = n;.
51d0: 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63    sqlite3_malloc
51e0: 5f 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 72  _failed = 0;.  r
51f0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
5200: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
5210: 61 67 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  age: sqlite_mall
5220: 6f 63 5f 73 74 61 74 0a 2a 2a 0a 2a 2a 20 52 65  oc_stat.**.** Re
5230: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5240: 6f 66 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  of prior calls t
5250: 6f 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  o sqliteMalloc()
5260: 20 61 6e 64 20 73 71 6c 69 74 65 46 72 65 65 28   and sqliteFree(
5270: 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  )..*/.#ifdef SQL
5280: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5290: 20 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   int sqlite_mall
52a0: 6f 63 5f 73 74 61 74 28 0a 20 20 76 6f 69 64 20  oc_stat(.  void 
52b0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
52c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
52d0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
52e0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
52f0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5300: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5310: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5320: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5330: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
5340: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
5350: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
5360: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
5370: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  {.  char zBuf[20
5380: 30 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  0];.  sprintf(zB
5390: 75 66 2c 20 22 25 64 20 25 64 20 25 64 22 2c 20  uf, "%d %d %d", 
53a0: 73 71 6c 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2c  sqlite3_nMalloc,
53b0: 20 73 71 6c 69 74 65 33 5f 6e 46 72 65 65 2c 20   sqlite3_nFree, 
53c0: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
53d0: 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ail);.  Tcl_Appe
53e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
53f0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
5400: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
5410: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ndif../*.** Usag
5420: 65 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  e:  sqlite_abort
5430: 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  .**.** Shutdown 
5440: 74 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65  the process imme
5450: 64 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69  diately.  This i
5460: 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68  s not a clean sh
5470: 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20  utdown..** This 
5480: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
5490: 74 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f  to test the reco
54a0: 76 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20  verability of a 
54b0: 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74  database in.** t
54c0: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72  he event of a pr
54d0: 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a  ogram crash..*/.
54e0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
54f0: 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20  e_abort(.  void 
5500: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5510: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5520: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5530: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5540: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5550: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5560: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5570: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5580: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
5590: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
55a0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
55b0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
55c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65  {.  assert( inte
55d0: 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68  rp==0 );   /* Th
55e0: 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  is will always f
55f0: 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ail */.  return 
5600: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
5610: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
5620: 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72  outine is a user
5630: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
5640: 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70  ction whose purp
5650: 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73  ose.** is to tes
5660: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74  t the sqlite_set
5670: 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a  _result() API..*
5680: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
5690: 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  stFunc(sqlite3_c
56a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
56b0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
56c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
56d0: 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e  {.  while( argc>
56e0: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
56f0: 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 73 71  char *zArg0 = sq
5700: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5710: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
5720: 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20  f( zArg0 ){.    
5730: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
5740: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22  StrICmp(zArg0, "
5750: 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20  int") ){.       
5760: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5770: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
5780: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
5790: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
57a0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
57b0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
57c0: 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20  int64")==0 ){.  
57d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
57e0: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
57f0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
5800: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29  e_int64(argv[1])
5810: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
5820: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
5830: 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22  p(zArg0,"string"
5840: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5850: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5860: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
5870: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5880: 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20  argv[1]), -1,.  
5890: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
58a0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
58b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
58c0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
58d0: 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  0,"double")==0 )
58e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
58f0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
5900: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
5910: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
5920: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
5930: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
5940: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e  StrICmp(zArg0,"n
5950: 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
5960: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5970: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
5980: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5990: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
59a0: 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d  (zArg0,"value")=
59b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
59c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
59d0: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
59e0: 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  [sqlite3_value_i
59f0: 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20  nt(argv[1])]);. 
5a00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5a10: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
5a20: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
5a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
5a40: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
5a50: 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32   }.    argc -= 2
5a60: 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b  ;.    argv += 2;
5a70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  .  }.  return;..
5a80: 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
5a90: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5aa0: 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74  r(context,"first
5ab0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
5ac0: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20   be one of: ".  
5ad0: 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73      "int int64 s
5ae0: 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c  tring double nul
5af0: 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d  l value", -1);.}
5b00: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
5b10: 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72   sqlite_register
5b20: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20  _test_function  
5b30: 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  DB  NAME.**.** R
5b40: 65 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74  egister the test
5b50: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e   SQL function on
5b60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
5b70: 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20   under the name 
5b80: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME..*/.static 
5b90: 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65  int test_registe
5ba0: 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  r_func(.  void *
5bb0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
5bc0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
5bd0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
5be0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
5bf0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
5c00: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
5c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5c20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
5c30: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
5c40: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
5c50: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
5c60: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
5c70: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
5c80: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
5c90: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
5ca0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5cb0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
5cc0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
5cd0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
5ce0: 20 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54        " DB FUNCT
5cf0: 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20  ION-NAME", 0);. 
5d00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5d10: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
5d20: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
5d30: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
5d40: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
5d50: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
5d60: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5d70: 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
5d80: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
5d90: 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73  8, 0, .      tes
5da0: 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  tFunc, 0, 0);.  
5db0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
5dc0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
5dd0: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
5de0: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
5df0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5e00: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
5e10: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
5e20: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
5e30: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53  ite3_finalize  S
5e40: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  TMT .**.** Final
5e50: 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ize a statement 
5e60: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
5e70: 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c  c int test_final
5e80: 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ize(.  void * cl
5e90: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
5ea0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
5eb0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
5ec0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
5ed0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
5ee0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
5ef0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
5f00: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
5f10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5f20: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
5f30: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
5f40: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
5f50: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
5f60: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
5f70: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
5f80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5f90: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
5fa0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
5fb0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
5fc0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
5fd0: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
5fe0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
5ff0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
6000: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ze(pStmt);.  Tcl
6010: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
6020: 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72  p, (char *)error
6030: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
6040: 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
6050: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
6060: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
6070: 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a  _reset  STMT .**
6080: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73  .** Finalize a s
6090: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
60a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
60b0: 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69  est_reset(.  voi
60c0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
60d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
60e0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
60f0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
6100: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
6110: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
6120: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
6130: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
6140: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
6160: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
6170: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
6180: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
6190: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
61a0: 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
61b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
61c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
61d0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
61e0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
61f0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
6200: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
6210: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6220: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
6230: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
6240: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
6250: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6260: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
6270: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
6280: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68  age:  sqlite3_ch
6290: 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52  anges DB.**.** R
62a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
62b0: 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65   of changes made
62c0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
62d0: 20 62 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c   by the last SQL
62e0: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  .** execution..*
62f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
6300: 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69  t_changes(.  voi
6310: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
6320: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6330: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
6340: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
6350: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
6360: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
6370: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
6380: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6390: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
63a0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
63b0: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54  be \"",.       T
63c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
63d0: 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
63e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
63f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
6400: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
6410: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
6420: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
6430: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
6440: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
6450: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
6460: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
6470: 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73  (sqlite3_changes
6480: 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (db)));.  return
6490: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
64a0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 22 73  * This is the "s
64b0: 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
64c0: 22 20 74 68 61 74 20 76 61 72 69 61 62 6c 65 73  " that variables
64d0: 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68   are bound to wh
64e0: 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f  en.** the FLAG o
64f0: 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ption of sqlite3
6500: 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74 69 63  _bind is "static
6510: 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ".*/.static char
6520: 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   *sqlite_static_
6530: 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a  bind_value = 0;.
6540: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
6550: 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20  qlite3_bind  VM 
6560: 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41   IDX  VALUE  FLA
6570: 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68  GS.**.** Sets th
6580: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49  e value of the I
6590: 44 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65 20  DX-th occurance 
65a0: 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72  of "?" in the or
65b0: 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74  iginal SQL.** st
65c0: 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20  ring.  VALUE is 
65d0: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20  the new value.  
65e0: 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22  If FLAGS=="null"
65f0: 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a   then VALUE is.*
6600: 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68  * ignored and th
6610: 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
6620: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47  o NULL.  If FLAG
6630: 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e  S=="static" then
6640: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73  .** the value is
6650: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
6660: 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61  e of a static va
6670: 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20  riable named.** 
6680: 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
6690: 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20  ind_value".  If 
66a0: 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20  FLAGS=="normal" 
66b0: 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  then a copy.** o
66c0: 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d  f the VALUE is m
66d0: 61 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ade..*/.static i
66e0: 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20  nt test_bind(.  
66f0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
6700: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6710: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
6720: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
6730: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
6740: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
6750: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
6760: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6770: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
6780: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
6790: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
67a0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
67b0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
67c0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
67d0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
67e0: 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  x;.  if( argc!=5
67f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
6800: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6810: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
6820: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
6830: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
6840: 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28  " VM IDX VALUE (
6850: 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d  null|static|norm
6860: 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  al)\"", 0);.    
6870: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6880: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
6890: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
68a0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74  p, argv[1], &pSt
68b0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
68c0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
68d0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
68e0: 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20   argv[2], &idx) 
68f0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6900: 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
6910: 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29  (argv[4],"null")
6920: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
6930: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
6940: 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
6950: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
6960: 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69  p(argv[4],"stati
6970: 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  c")==0 ){.    rc
6980: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
6990: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
69a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
69b0: 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30  ind_value, -1, 0
69c0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
69d0: 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e  trcmp(argv[4],"n
69e0: 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  ormal")==0 ){.  
69f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
6a00: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
6a10: 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31  idx, argv[3], -1
6a20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
6a30: 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
6a40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6a50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20  lt(interp, "4th 
6a60: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
6a70: 62 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  be ".        "\"
6a80: 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74  null\" or \"stat
6a90: 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c  ic\" or \"normal
6aa0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
6ab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6ac0: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
6ad0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d     char zBuf[50]
6ae0: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
6af0: 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
6b00: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
6b10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
6b20: 42 75 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53  Buf, sqlite3ErrS
6b30: 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
6b40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6b50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
6b60: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
6b70: 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
6b80: 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72  _collate <db ptr
6b90: 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
6ba0: 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a  e> <utf16be>.**.
6bb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6bc0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6bd0: 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c   that SQLite sel
6be0: 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74  ects the correct
6bf0: 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65   collation.** se
6c00: 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20  quence callback 
6c10: 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65  when multiple ve
6c20: 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66  rsions (for diff
6c30: 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64  erent text encod
6c40: 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61  ings).** are ava
6c50: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61  ilable..**.** Ca
6c60: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6c70: 6e 65 20 72 65 67 69 73 74 65 72 73 20 74 68 65  ne registers the
6c80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6c90: 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  nce "test_collat
6ca0: 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62  e".** with datab
6cb0: 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
6cc0: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
6cd0: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c  ment must be a l
6ce0: 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20  ist of three.** 
6cf0: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20  boolean values. 
6d00: 49 66 20 74 68 65 20 66 69 72 73 74 20 69 73 20  If the first is 
6d10: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
6d20: 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c  sion of test_col
6d30: 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73  late is.** regis
6d40: 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c  tered for UTF-8,
6d50: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69   if the second i
6d60: 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
6d70: 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
6d80: 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c  for.** UTF-16le,
6d90: 20 69 66 20 74 68 65 20 74 68 69 72 64 20 69 73   if the third is
6da0: 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
6db0: 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
6dc0: 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69  ilable..** Previ
6dd0: 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ous versions of 
6de0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65  test_collate are
6df0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
6e00: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
6e10: 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c  quence test_coll
6e20: 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ate is implement
6e30: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
6e40: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54  e.** following T
6e50: 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a  CL script:.**.**
6e60: 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65     "test_collate
6e70: 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68   <enc> <lhs> <rh
6e80: 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c  s>".**.** The <l
6e90: 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72  hs> and <rhs> ar
6ea0: 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
6eb0: 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c   being compared,
6ec0: 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d   encoded in UTF-
6ed0: 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20  8..** The <enc> 
6ee0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
6ef0: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
6f00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
6f10: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69  ion that.** SQLi
6f20: 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63  te selected to c
6f30: 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73  all. The TCL tes
6f40: 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65  t script impleme
6f50: 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74  nts the.** "test
6f60: 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a  _collate" proc..
6f70: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
6f80: 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77  this will only w
6f90: 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74  ork with one int
6fa0: 65 70 72 65 74 65 72 20 61 74 20 61 20 74 69 6d  epreter at a tim
6fb0: 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74  e, as the.** int
6fc0: 65 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75  erp pointer to u
6fd0: 73 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69  se when evaluati
6fe0: 6e 67 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  ng the TCL scrip
6ff0: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a  t is stored in.*
7000: 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  * pTestCollateIn
7010: 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  terp..*/.static 
7020: 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73  Tcl_Interp* pTes
7030: 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
7040: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
7050: 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20  collate_func(.  
7060: 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69  void *pCtx, .  i
7070: 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nA, const voi
7080: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
7090: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a   const void *zB.
70a0: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
70b0: 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74  *i = pTestCollat
70c0: 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65  eInterp;.  int e
70d0: 6e 63 69 6e 20 3d 20 28 69 6e 74 29 70 43 74 78  ncin = (int)pCtx
70e0: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
70f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
7100: 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Val;.  Tcl_Obj *
7110: 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f  pX;..  pX = Tcl_
7120: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
7130: 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29  st_collate", -1)
7140: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
7150: 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69  ount(pX);..  swi
7160: 74 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20  tch( encin ){.  
7170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
7180: 46 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  F8:.      Tcl_Li
7190: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
71a0: 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
71b0: 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22  tringObj("UTF-8"
71c0: 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
71d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
71e0: 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20  ITE_UTF16LE:.   
71f0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
7200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
7210: 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
7220: 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29  j("UTF-16LE",-1)
7230: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7240: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7250: 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54  UTF16BE:.      T
7260: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7270: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
7280: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
7290: 54 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20  TF-16BE",-1));. 
72a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
72b0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
72c0: 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20  ssert(0);.  }.. 
72d0: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
72e0: 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c  alueNew();.  sql
72f0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
7300: 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e  pVal, nA, zA, en
7310: 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  cin, SQLITE_STAT
7320: 49 43 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  IC);.  Tcl_ListO
7330: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7340: 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
7350: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ngObj(sqlite3_va
7360: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d  lue_text(pVal),-
7370: 31 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  1));.  sqlite3Va
7380: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
7390: 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53  nB, zB, encin, S
73a0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
73b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
73c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
73d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
73e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
73f0: 78 74 28 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20  xt(pVal),-1));. 
7400: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
7410: 65 28 70 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f  e(pVal);..  Tcl_
7420: 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c  EvalObjEx(i, pX,
7430: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
7440: 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
7450: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
7460: 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  (i, Tcl_GetObjRe
7470: 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a  sult(i), &res);.
7480: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
7490: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
74a0: 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  collate(.  void 
74b0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
74c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
74d0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
74e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
74f0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
7500: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
7510: 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  val;..  if( objc
7520: 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=5 ) goto bad_a
7530: 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c  rgs;.  pTestColl
7540: 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65  ateInterp = inte
7550: 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  rp;.  if( getDbP
7560: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
7570: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
7580: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
7590: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
75a0: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
75b0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
75c0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
75d0: 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
75e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
75f0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
7600: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
7610: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
7620: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
7630: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
7640: 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65  ITE_UTF8, val?te
7650: 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
7660: 30 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  0);.  if( TCL_OK
7670: 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
7680: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7690: 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
76a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
76b0: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  R;.  sqlite3_cre
76c0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
76d0: 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
76e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
76f0: 2c 20 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64  , .        (void
7700: 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 4c   *)SQLITE_UTF16L
7710: 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c  E, val?test_coll
7720: 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69  ate_func:0);.  i
7730: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
7740: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
7750: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
7760: 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
7770: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
7780: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
7790: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  lation(db, "test
77a0: 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
77b0: 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20  E_UTF16BE, .    
77c0: 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
77d0: 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f  TE_UTF16BE, val?
77e0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
77f0: 63 3a 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  c:0);.  .  retur
7800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61  n TCL_OK;..bad_a
7810: 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rgs:.  Tcl_Appen
7820: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7830: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7840: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
7850: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
7860: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
7870: 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74  , 0), " <DB> <ut
7880: 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
7890: 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20  tf16be>", 0);.  
78a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
78b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
78c0: 3a 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74  : add_test_funct
78d0: 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74  ion <db ptr> <ut
78e0: 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
78f0: 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68  tf16be>.**.** Th
7900: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
7910: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74  sed to test that
7920: 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20   SQLite selects 
7930: 74 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72  the correct user
7940: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  .** function cal
7950: 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69  lback when multi
7960: 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f  ple versions (fo
7970: 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74  r different text
7980: 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61   encodings).** a
7990: 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  re available..**
79a0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
79b0: 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
79c0: 72 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76  rs up to three v
79d0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75  ersions of the u
79e0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ser function.** 
79f0: 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20  "test_function" 
7a00: 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61  with database ha
7a10: 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74  ndle <db>.  If t
7a20: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7a30: 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74  nt is.** true, t
7a40: 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66  hen a version of
7a50: 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69   test_function i
7a60: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
7a70: 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a   UTF-8, if the.*
7a80: 2a 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c  * third is true,
7a90: 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65   a version is re
7aa0: 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
7ab0: 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f  -16le, if the fo
7ac0: 75 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c  urth is.** true,
7ad0: 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73   a UTF-16be vers
7ae0: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
7af0: 2e 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  .  Previous vers
7b00: 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f  ions of.** test_
7b10: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c  function are del
7b20: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
7b30: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  user function is
7b40: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
7b50: 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c  calling the foll
7b60: 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
7b70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
7b80: 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c  function <enc> <
7b90: 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72  arg>".**.** Wher
7ba0: 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f  e <enc> is one o
7bb0: 66 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c  f UTF-8, UTF-16L
7bc0: 45 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e  E or UTF16BE, an
7bd0: 64 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a  d <arg> is the.*
7be0: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
7bf0: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
7c00: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
7c10: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
7c20: 20 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73   by.** the TCL s
7c30: 63 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73  cript is used as
7c40: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
7c50: 65 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e  e of the SQL fun
7c60: 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20  ction. It.** is 
7c70: 70 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65  passed to SQLite
7c80: 20 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20   using UTF-16BE 
7c90: 66 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74  for a UTF-8 test
7ca0: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46  _function(), UTF
7cb0: 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d  -8.** for a UTF-
7cc0: 31 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69  16LE test_functi
7cd0: 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36  on(), and UTF-16
7ce0: 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d  LE for an implem
7cf0: 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  entation that.**
7d00: 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42   prefers UTF-16B
7d10: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
7d20: 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
7d30: 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f  utf8(.  sqlite3_
7d40: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
7d50: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
7d60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7d70: 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
7d80: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
7d90: 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
7da0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
7db0: 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
7dc0: 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
7dd0: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
7de0: 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
7df0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
7e00: 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
7e10: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
7e20: 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
7e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
7e50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7e60: 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b  j("UTF-8", -1));
7e70: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
7e80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
7e90: 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
7ea0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7eb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7ec0: 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
7ed0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
7ee0: 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
7ef0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
7f00: 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c  Count(pX);.  sql
7f10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7f20: 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74  (pCtx, Tcl_GetSt
7f30: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
7f40: 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  p), -1, SQLITE_T
7f50: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61  RANSIENT);.  pVa
7f60: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
7f70: 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  New();.  sqlite3
7f80: 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
7f90: 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
7fa0: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
7fb0: 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
7fc0: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
7fd0: 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
7fe0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
7ff0: 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
8000: 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56  alue_text16be(pV
8010: 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
8020: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
8030: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
8040: 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
8050: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
8060: 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28  unction_utf16le(
8070: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
8080: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
8090: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
80a0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
80b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
80c0: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
80d0: 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
80e0: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
80f0: 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
8100: 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
8110: 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
8120: 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
8130: 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
8140: 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
8150: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
8160: 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
8170: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8180: 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
8190: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
81a0: 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16LE", -1));. 
81b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
81c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
81d0: 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
81e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
81f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8200: 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
8210: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
8220: 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
8230: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
8240: 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
8250: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
8260: 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  w();.  sqlite3Va
8270: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
8280: 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
8290: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
82a0: 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
82b0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
82c0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
82d0: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
82e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
82f0: 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49  xt(pVal),-1,SQLI
8300: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8310: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
8320: 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69  e(pVal);.}.stati
8330: 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63  c void test_func
8340: 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20  tion_utf16be(.  
8350: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8360: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
8370: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
8380: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
83a0: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
83b0: 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
83c0: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
83d0: 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
83e0: 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
83f0: 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
8400: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
8410: 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
8420: 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
8430: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
8440: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
8450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8460: 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
8470: 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
8480: 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  6BE", -1));.  Tc
8490: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
84a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
84b0: 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65  X, .      Tcl_Ne
84c0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
84d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
84e0: 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
84f0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
8500: 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
8510: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
8520: 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
8530: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
8540: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
8550: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
8560: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
8570: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
8580: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
8590: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
85a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
85b0: 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78  lt_text16le(pCtx
85c0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
85d0: 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
85e0: 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
85f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
8600: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
8610: 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pVal);.}.static 
8620: 69 6e 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  int test_functio
8630: 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
8640: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
8650: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
8660: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
8670: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
8680: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
8690: 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a  db;.  int val;..
86a0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20    if( objc!=5 ) 
86b0: 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
86c0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
86d0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
86e0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
86f0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
8700: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
8710: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
8720: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
8730: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
8740: 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
8750: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
8760: 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
8770: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8780: 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
8790: 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
87a0: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
87b0: 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
87c0: 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c  unction_utf8, 0,
87d0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
87e0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
87f0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
8800: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
8810: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
8820: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
8830: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
8840: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8850: 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
8860: 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
8870: 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
8880: 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
8890: 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c  unction_utf16le,
88a0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
88b0: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
88c0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
88d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
88e0: 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
88f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
8900: 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
8910: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8920: 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
8930: 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
8940: 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20  TE_UTF16BE, .   
8950: 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
8960: 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
8970: 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  be, 0, 0);.  }..
8980: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8990: 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
89a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
89b0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
89c0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
89d0: 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65  "",.      Tcl_Ge
89e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
89f0: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44  bjv[0], 0), " <D
8a00: 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  B> <utf8> <utf16
8a10: 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20  le> <utf16be>", 
8a20: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
8a30: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69  _ERROR;.}..stati
8a40: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  c int sqlite3_cr
8a50: 61 73 68 70 61 72 61 6d 73 28 0a 20 20 76 6f 69  ashparams(.  voi
8a60: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
8a70: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8a80: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
8a90: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
8aa0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
8ab0: 64 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 69 6e  def OS_TEST.  in
8ac0: 74 20 64 65 6c 61 79 3b 0a 20 20 69 66 28 20 6f  t delay;.  if( o
8ad0: 62 6a 63 21 3d 33 20 29 20 67 6f 74 6f 20 62 61  bjc!=3 ) goto ba
8ae0: 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 54 63  d_args;.  if( Tc
8af0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
8b00: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
8b10: 20 26 64 65 6c 61 79 29 20 29 20 72 65 74 75 72   &delay) ) retur
8b20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
8b30: 71 6c 69 74 65 33 53 65 74 43 72 61 73 68 50 61  qlite3SetCrashPa
8b40: 72 61 6d 73 28 64 65 6c 61 79 2c 20 54 63 6c 5f  rams(delay, Tcl_
8b50: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
8b60: 5d 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ]));.#endif.  re
8b70: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 23 69  turn TCL_OK;..#i
8b80: 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 62 61 64  fdef OS_TEST.bad
8b90: 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70  _args:.  Tcl_App
8ba0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8bb0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
8bc0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
8bd0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
8be0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8bf0: 30 5d 2c 20 30 29 2c 20 22 3c 64 65 6c 61 79 3e  0], 0), "<delay>
8c00: 20 3c 66 69 6c 65 6e 61 6d 65 3e 22 2c 20 30 29   <filename>", 0)
8c10: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
8c20: 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  RROR;.#endif.}..
8c30: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
8c40: 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
8c50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
8c60: 78 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75  xists for one pu
8c70: 72 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69  rpose - to provi
8c80: 64 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75  de a place to pu
8c90: 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e  t a.** breakpoin
8ca0: 74 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20  t with GDB that 
8cb0: 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64  can be triggered
8cc0: 20 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e   using TCL code.
8cd0: 20 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72    The use.** for
8ce0: 20 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20   this is when a 
8cf0: 70 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20  particular test 
8d00: 66 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74  fails on (say) t
8d10: 68 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74  he 1485th iterat
8d20: 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54  ion..** In the T
8d30: 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20  CL test script, 
8d40: 77 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20  we can add code 
8d50: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
8d60: 20 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38       if {$i==148
8d70: 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a  5} breakpoint.**
8d80: 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73  .** Then run tes
8d90: 74 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20  tfixture in the 
8da0: 64 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69  debugger and wai
8db0: 74 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70  t for the breakp
8dc0: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e  oint to.** fire.
8dd0: 20 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61    Then additiona
8de0: 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61  l breakpoints ca
8df0: 6e 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63  n be set to trac
8e00: 65 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a  e down the bug..
8e10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
8e20: 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20  st_breakpoint(. 
8e30: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8e40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8e50: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8e60: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8e70: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8e80: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8e90: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8ea0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8eb0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8ec0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8ee0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
8ef0: 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
8f00: 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20   TCL_OK;        
8f10: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
8f20: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  /.}../*.** Usage
8f30: 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
8f40: 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56 41 4c  _int  STMT N VAL
8f50: 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  UE.**.** Test th
8f60: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  e sqlite3_bind_i
8f70: 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  nt interface.  S
8f80: 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
8f90: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
8fa0: 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
8fb0: 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
8fc0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
8fd0: 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
8fe0: 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
8ff0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
9000: 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
9010: 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
9020: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
9030: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  int(.  void * cl
9040: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
9050: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
9060: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
9070: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
9080: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
9090: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
90a0: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 76  int idx;.  int v
90b0: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
90c0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
90d0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
90e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
90f0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9100: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
9110: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
9120: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
9130: 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
9140: 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
9150: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9160: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
9170: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
9180: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
9190: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
91a0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
91b0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
91c0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
91d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
91e0: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
91f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
9200: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
9210: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
9220: 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65  3], &value) ) re
9230: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9240: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
9250: 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
9260: 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
9270: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
9290: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
92a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
92b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
92c0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
92d0: 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56 41  int64  STMT N VA
92e0: 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
92f0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
9300: 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65 2e  int64 interface.
9310: 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
9320: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
9330: 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
9340: 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
9350: 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
9360: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
9370: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
9380: 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
9390: 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
93a0: 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
93b0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
93c0: 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  nd_int64(.  void
93d0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
93e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
93f0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
9400: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
9410: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
9420: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
9430: 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
9440: 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  i64 value;.  int
9450: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
9460: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
9470: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9480: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9490: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
94a0: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
94b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
94c0: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
94d0: 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
94e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
94f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
9500: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
9510: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9520: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
9530: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
9540: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
9550: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
9560: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
9570: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
9580: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9590: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
95a0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
95b0: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
95c0: 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
95d0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
95e0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
95f0: 74 36 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  t64(pStmt, idx, 
9600: 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 72 63  value);.  if( rc
9610: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9620: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9630: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
9640: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
9650: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
9660: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
9670: 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  e  STMT N VALUE.
9680: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
9690: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
96a0: 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  le interface.  S
96b0: 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
96c0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
96d0: 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
96e0: 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
96f0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
9700: 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
9710: 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
9720: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
9730: 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
9740: 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
9750: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
9760: 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
9770: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
9780: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9790: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
97a0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
97b0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
97c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
97d0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f  .  int idx;.  do
97e0: 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e  uble value;.  in
97f0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
9800: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
9810: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9820: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9830: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9840: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
9850: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9860: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
9870: 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
9880: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9890: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
98a0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
98b0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
98c0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
98d0: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
98e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
98f0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
9900: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
9910: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
9920: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9930: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f  .  if( Tcl_GetDo
9940: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ubleFromObj(inte
9950: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
9960: 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
9970: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
9980: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
9990: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c  uble(pStmt, idx,
99a0: 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 72   value);.  if( r
99b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
99c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
99d0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
99e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
99f0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
9a00: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20  lite3_bind_null 
9a10: 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65   STMT N.**.** Te
9a20: 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
9a30: 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61  ind_null interfa
9a40: 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
9a50: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9a60: 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
9a70: 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
9a80: 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
9a90: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
9aa0: 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
9ab0: 69 6e 64 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74  inds a NULL to t
9ac0: 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  he wildcard..*/.
9ad0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
9ae0: 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69  bind_null(.  voi
9af0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
9b00: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9b10: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
9b20: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
9b30: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
9b40: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
9b50: 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
9b60: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
9b70: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
9b80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9b90: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9ba0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9bb0: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
9bc0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9bd0: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
9be0: 22 20 53 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20  " STMT N", 0);. 
9bf0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9c00: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
9c10: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
9c20: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9c30: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
9c40: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
9c50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
9c60: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
9c70: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
9c80: 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
9c90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
9ca0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
9cb0: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
9cc0: 64 78 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  dx);.  if( rc!=S
9cd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9cf0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
9d00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
9d10: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
9d20: 33 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d  3_bind_text  STM
9d30: 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53  T N STRING BYTES
9d40: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
9d50: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
9d60: 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  t interface.  ST
9d70: 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
9d80: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
9d90: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
9da0: 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
9db0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
9dc0: 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
9dd0: 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
9de0: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52  UTF-8 string STR
9df0: 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
9e00: 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
9e10: 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
9e20: 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
9e30: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
9e40: 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20  _text(.  void * 
9e50: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
9e60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9e70: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
9e80: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
9e90: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
9ea0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
9eb0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
9ec0: 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
9ed0: 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
9ee0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
9ef0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9f00: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9f10: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9f20: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
9f30: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
9f40: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
9f50: 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
9f60: 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
9f70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9f80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
9f90: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
9fa0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
9fb0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
9fc0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
9fd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9fe0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
9ff0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a000: 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
a010: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a020: 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f  ;.  value = Tcl_
a030: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
a040: 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
a050: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
a060: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
a070: 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
a080: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
a090: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
a0a0: 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  xt(pStmt, idx, v
a0b0: 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c  alue, bytes, SQL
a0c0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
a0d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a0e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
a0f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a100: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
a110: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a120: 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
a130: 64 5f 74 65 78 74 31 36 20 20 53 54 4d 54 20 4e  d_text16  STMT N
a140: 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
a150: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
a160: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
a170: 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
a180: 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
a190: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
a1a0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
a1b0: 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
a1c0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
a1d0: 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
a1e0: 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
a1f0: 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52  TF-16 string STR
a200: 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
a210: 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
a220: 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
a230: 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
a240: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
a250: 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20  _text16(.  void 
a260: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
a270: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
a280: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
a290: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a2a0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
a2b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
a2c0: 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
a2d0: 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
a2e0: 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
a2f0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
a300: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
a310: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a320: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
a330: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
a340: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
a350: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
a360: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
a370: 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c   N VALUE BYTES",
a380: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
a390: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
a3a0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
a3b0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
a3c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
a3d0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
a3e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a3f0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
a400: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a410: 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
a420: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
a430: 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63  OR;.  value = Tc
a440: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
a450: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30  omObj(objv[3], 0
a460: 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
a470: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
a480: 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
a490: 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
a4a0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
a4b0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
a4c0: 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  t16(pStmt, idx, 
a4d0: 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62  (void *)value, b
a4e0: 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41  ytes, SQLITE_TRA
a4f0: 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 72  NSIENT);.  if( r
a500: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a510: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a520: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
a530: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a540: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
a550: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
a560: 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54   STMT N DATA BYT
a570: 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
a580: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62  e sqlite3_bind_b
a590: 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20  lob interface.  
a5a0: 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
a5b0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
a5c0: 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
a5d0: 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
a5e0: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
a5f0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
a600: 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
a610: 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69  a BLOB to the wi
a620: 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c 4f  ldcard.  The BLO
a630: 42 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73  B is BYTES bytes
a640: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
a650: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
a660: 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  d_blob(.  void *
a670: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
a680: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a690: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
a6a0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
a6b0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
a6c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
a6d0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
a6e0: 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
a6f0: 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
a700: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
a710: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
a720: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a730: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
a740: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
a750: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
a760: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a770: 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
a780: 4e 20 44 41 54 41 20 42 59 54 45 53 22 2c 20 30  N DATA BYTES", 0
a790: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a7a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
a7b0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
a7c0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
a7d0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
a7e0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
a7f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a800: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
a810: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a820: 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
a830: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a840: 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f  ;.  value = Tcl_
a850: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
a860: 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
a870: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
a880: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
a890: 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
a8a0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
a8b0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
a8c0: 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  ob(pStmt, idx, v
a8d0: 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c  alue, bytes, SQL
a8e0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
a8f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a900: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
a910: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a920: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
a930: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a940: 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  e: sqlite3_errco
a950: 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  de DB.**.** Retu
a960: 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  rn the string re
a970: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
a980: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
a990: 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a  sqlite3_* API.**
a9a0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67   error code. e.g
a9b0: 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  . "SQLITE_ERROR"
a9c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a9d0: 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20 20  test_errcode(.  
a9e0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
a9f0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
aa00: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
aa10: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
aa20: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
aa30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
aa40: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
aa50: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
aa60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
aa70: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
aa80: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
aa90: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
aaa0: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
aab0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
aac0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
aad0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
aae0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
aaf0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ab00: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
ab10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
ab20: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ab30: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72  erp, (char *)err
ab40: 6f 72 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 65  orName(sqlite3_e
ab50: 72 72 63 6f 64 65 28 64 62 29 29 2c 20 30 29 3b  rrcode(db)), 0);
ab60: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
ab70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
ab80: 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20  :   test_errmsg 
ab90: 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
aba0: 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65   the UTF-8 repre
abb0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
abc0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
abd0: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
abe0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
abf0: 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
ac00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
ac10: 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f  est_errmsg(.  vo
ac20: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
ac30: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
ac40: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
ac50: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
ac60: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ac70: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 63 6f  sqlite *db;.  co
ac80: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
ac90: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
aca0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
acb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
acc0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
acd0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
ace0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
acf0: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
ad00: 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
ad10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ad20: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
ad30: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
ad40: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ad50: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
ad60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
ad70: 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
ad80: 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63  errmsg(db);.  Tc
ad90: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
ada0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
adb0: 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31  ringObj(zErr, -1
adc0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
add0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
ade0: 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
adf0: 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  sg16 DB.**.** Re
ae00: 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36  turns the UTF-16
ae10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
ae20: 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
ae30: 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
ae40: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
ae50: 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
ae60: 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61   call. This is a
ae70: 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65   byte array obje
ae80: 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a  ct at the TCL .*
ae90: 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20  * level, and it 
aea0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30  includes the 0x0
aeb0: 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  0 0x00 terminato
aec0: 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  r bytes at the e
aed0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46  nd of the.** UTF
aee0: 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  -16 string..*/.s
aef0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
af00: 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20  rrmsg16(.  void 
af10: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
af20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
af30: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
af40: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
af50: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
af60: 69 74 65 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  ite *db;.  const
af70: 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20 69   void *zErr;.  i
af80: 6e 74 20 62 79 74 65 73 3b 0a 0a 20 20 69 66 28  nt bytes;..  if(
af90: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
afa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
afb0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
afc0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
afd0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
afe0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
aff0: 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
b000: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
b010: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
b020: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
b030: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
b040: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
b050: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
b060: 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
b070: 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
b080: 31 36 28 64 62 29 3b 0a 20 20 62 79 74 65 73 20  16(db);.  bytes 
b090: 3d 20 73 71 6c 69 74 65 33 75 74 66 31 36 42 79  = sqlite3utf16By
b0a0: 74 65 4c 65 6e 28 7a 45 72 72 2c 20 2d 31 29 3b  teLen(zErr, -1);
b0b0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
b0c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b0d0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
b0e0: 7a 45 72 72 2c 20 62 79 74 65 73 29 29 3b 0a 20  zErr, bytes));. 
b0f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
b100: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
b110: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
b120: 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
b130: 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  lvar.**.** Compi
b140: 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
b150: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
b160: 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
b170: 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
b180: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
b190: 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
b1a0: 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
b1b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
b1c0: 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
b1d0: 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
b1e0: 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
b1f0: 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
b200: 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
b210: 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
b220: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
b230: 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
b240: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
b250: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
b260: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
b270: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
b280: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
b290: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
b2a0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
b2b0: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74  *zSql;.  int byt
b2c0: 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  es;.  const char
b2d0: 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *zTail = 0;.  s
b2e0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
b2f0: 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
b300: 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72  Buf[50];.  int r
b310: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
b320: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
b330: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b340: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
b350: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
b360: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
b370: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
b380: 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
b390: 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
b3a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b3b0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
b3c0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
b3d0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
b3e0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
b3f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b400: 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
b410: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
b420: 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
b430: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
b440: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
b450: 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
b460: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
b470: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
b480: 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
b490: 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c  , &pStmt, &zTail
b4a0: 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 29  );.  if( zTail )
b4b0: 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e  {.    if( bytes>
b4c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  =0 ){.      byte
b4d0: 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54 61  s = bytes - (zTa
b4e0: 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  il-zSql);.    }.
b4f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
b500: 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
b510: 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74  4], 0, Tcl_NewSt
b520: 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62  ringObj(zTail, b
b530: 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20  ytes), 0);.  }. 
b540: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b550: 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
b560: 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ( pStmt==0 );.  
b570: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
b580: 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
b590: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b5a0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
b5b0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
b5c0: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
b5d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b5e0: 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
b5f0: 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 6b 65 50  ){.    if( makeP
b600: 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
b610: 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
b620: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b630: 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
b640: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b650: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
b660: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
b670: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
b680: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 44  qlite3_prepare D
b690: 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
b6a0: 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
b6b0: 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
b6c0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
b6d0: 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
b6e0: 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
b6f0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
b700: 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
b710: 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
b720: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
b730: 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
b740: 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
b750: 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
b760: 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
b770: 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
b780: 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
b790: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
b7a0: 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31  nt test_prepare1
b7b0: 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
b7c0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
b7d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
b7e0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
b7f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b800: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
b810: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
b820: 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20   *zSql;.  const 
b830: 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  void *zTail = 0;
b840: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69  .  Tcl_Obj *pTai
b850: 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
b860: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
b870: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
b880: 5d 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  ];.  int bytes; 
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8a0: 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
b8b0: 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
b8c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
b8d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b8e0: 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
b8f0: 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
b900: 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
b910: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
b920: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b930: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
b940: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
b950: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
b960: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
b970: 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
b980: 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20   tailvar", 0);. 
b990: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b9a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
b9b0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
b9c0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b9d0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
b9e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b9f0: 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
ba00: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
ba10: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
ba20: 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  objlen);.  if( T
ba30: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
ba40: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
ba50: 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
ba60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
ba70: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
ba80: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
ba90: 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  6(db, zSql, byte
baa0: 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69  s, &pStmt, &zTai
bab0: 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  l) ){.    return
bac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
bad0: 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a  .  if( zTail ){.
bae0: 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a      objlen = obj
baf0: 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54 61  len - ((u8 *)zTa
bb00: 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a  il-(u8 *)zSql);.
bb10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 62 6a    }else{.    obj
bb20: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  len = 0;.  }.  p
bb30: 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  Tail = Tcl_NewBy
bb40: 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a  teArrayObj((u8 *
bb50: 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b  )zTail, objlen);
bb60: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
bb70: 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 54 63  unt(pTail);.  Tc
bb80: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
bb90: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
bba0: 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 54 63   pTail, 0);.  Tc
bbb0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
bbc0: 54 61 69 6c 29 3b 0a 0a 20 20 69 66 28 20 70 53  Tail);..  if( pS
bbd0: 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  tmt ){.    if( m
bbe0: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
bbf0: 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
bc00: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
bc10: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
bc20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bc30: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
bc40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
bc50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
bc60: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69   sqlite3_open fi
bc70: 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d  lename ?options-
bc80: 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  list?.*/.static 
bc90: 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20  int test_open(. 
bca0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
bcb0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
bcc0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
bcd0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
bce0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
bcf0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bd00: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
bd10: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
bd20: 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  c;.  char zBuf[1
bd30: 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
bd40: 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29  !=3 && objc!=2 )
bd50: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
bd60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
bd70: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
bd80: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
bd90: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
bda0: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
bdb0: 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d  ilename options-
bdc0: 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72  list", 0);.    r
bdd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bde0: 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d  .  }..  zFilenam
bdf0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
be00: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 72 63  g(objv[1]);.  rc
be10: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
be20: 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b  zFilename, &db);
be30: 0a 20 20 0a 20 20 69 66 28 20 6d 61 6b 65 50 6f  .  .  if( makePo
be40: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
be50: 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
be60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
be70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
be80: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
be90: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
bea0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
beb0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
bec0: 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  n16 filename opt
bed0: 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ions.*/.static i
bee0: 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a  nt test_open16(.
bef0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
bf00: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
bf10: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
bf20: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
bf30: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
bf40: 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
bf50: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
bf60: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
bf70: 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  rc;.  char zBuf[
bf80: 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
bf90: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
bfa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bfb0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
bfc0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
bfd0: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
bfe0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
bff0: 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
c000: 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
c010: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c020: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
c030: 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
c040: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
c050: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
c060: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
c070: 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  en16(zFilename, 
c080: 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d  &db);.  .  if( m
c090: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
c0a0: 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
c0b0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c0c0: 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
c0d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
c0e0: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
c0f0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
c100: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
c110: 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a  3_step STMT.**.*
c120: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74  * Advance the st
c130: 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e  atement to the n
c140: 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ext row..*/.stat
c150: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70  ic int test_step
c160: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
c170: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
c180: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
c190: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
c1a0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
c1b0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
c1c0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
c1d0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
c1e0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
c1f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c200: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
c210: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
c220: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
c230: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
c240: 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
c250: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c260: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
c270: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
c280: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
c290: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
c2a0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
c2b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
c2c0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
c2d0: 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28  Stmt);..  /* if(
c2e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c2f0: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52   && rc!=SQLITE_R
c300: 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  OW ) return TCL_
c310: 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f  ERROR; */.  Tcl_
c320: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c330: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
c340: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
c350: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
c360: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
c370: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
c380: 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  nt STMT .**.** R
c390: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c3a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
c3b0: 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20  rned by the sql 
c3c0: 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a  statement STMT..
c3d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
c3e0: 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  st_column_count(
c3f0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
c400: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
c410: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
c420: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
c430: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
c440: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
c450: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
c460: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
c470: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c480: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
c490: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
c4a0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
c4b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
c4c0: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
c4d0: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
c4e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c4f0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
c500: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
c510: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
c520: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
c530: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
c540: 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
c550: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c560: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
c570: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
c580: 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
c590: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c5a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
c5b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c5c0: 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
c5d0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
c5e0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64 61  e type of the da
c5f0: 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
c600: 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
c610: 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  rent row..*/.sta
c620: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
c630: 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  umn_type(.  void
c640: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
c650: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c660: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
c670: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
c680: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
c690: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
c6a0: 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
c6b0: 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f  int tp;..  if( o
c6c0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
c6d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c6e0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
c6f0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
c700: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
c710: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c720: 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
c730: 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
c740: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c750: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
c760: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
c770: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c780: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
c790: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
c7a0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
c7b0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
c7c0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
c7d0: 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
c7e0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20  _ERROR;..  tp = 
c7f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
c800: 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ype(pStmt, col);
c810: 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29 7b  .  switch( tp ){
c820: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
c830: 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20  _INTEGER: .     
c840: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
c850: 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22  nterp, "INTEGER"
c860: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
c870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c880: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
c890: 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  L:.      Tcl_Set
c8a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c8b0: 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49  NULL", TCL_STATI
c8c0: 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
c8d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
c8e0: 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54  E_FLOAT:.      T
c8f0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
c900: 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43  erp, "FLOAT", TC
c910: 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
c920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
c930: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20  e SQLITE_TEXT:. 
c940: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
c950: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54  lt(interp, "TEXT
c960: 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
c970: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c980: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
c990: 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  OB:.      Tcl_Se
c9a0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
c9b0: 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54  "BLOB", TCL_STAT
c9c0: 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
c9d0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
c9e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
c9f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
ca00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
ca10: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
ca20: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54  olumn_int64 STMT
ca30: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
ca40: 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
ca50: 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
ca60: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
ca70: 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a  row cast as an.*
ca80: 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29 20  * wide (64-bit) 
ca90: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
caa0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
cab0: 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  mn_int64(.  void
cac0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
cad0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cae0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
caf0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
cb00: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
cb10: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
cb20: 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
cb30: 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28  i64 iVal;..  if(
cb40: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
cb50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cb60: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
cb70: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
cb80: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
cb90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
cba0: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
cbb0: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
cbc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cbd0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
cbe0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
cbf0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
cc00: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
cc10: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
cc20: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
cc30: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
cc40: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
cc50: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
cc60: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61  CL_ERROR;..  iVa
cc70: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
cc80: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
cc90: 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
cca0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
ccb0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
ccc0: 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(iVal));.  ret
ccd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
cce0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
ccf0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  te3_column_blob 
cd00: 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
cd10: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
cd20: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f  olumn_blob(.  vo
cd30: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
cd40: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cd50: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
cd60: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
cd70: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
cd80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
cd90: 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
cda0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f  .  int len;.  co
cdb0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b  nst void *pBlob;
cdc0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
cdd0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
cde0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cdf0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
ce00: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
ce10: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
ce20: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
ce30: 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
ce40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ce50: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
ce60: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
ce70: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
ce80: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
ce90: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
cea0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ceb0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
cec0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
ced0: 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
cee0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cef0: 0a 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  pBlob = sqli
cf00: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
cf10: 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 6c  pStmt, col);.  l
cf20: 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  en = sqlite3_col
cf30: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
cf40: 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
cf50: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
cf60: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
cf70: 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e  ayObj(pBlob, len
cf80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
cf90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
cfa0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
cfb0: 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20  umn_double STMT 
cfc0: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
cfd0: 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20  urn the data in 
cfe0: 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
cff0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
d000: 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f 75  ow cast as a dou
d010: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
d020: 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64  nt test_column_d
d030: 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
d040: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
d050: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d060: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
d070: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
d080: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
d090: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
d0a0: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75    int col;.  dou
d0b0: 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28  ble rVal;..  if(
d0c0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
d0d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d0e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
d0f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
d100: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
d110: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d120: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
d130: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
d140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d150: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
d160: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
d170: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
d180: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
d190: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
d1a0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
d1b0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
d1c0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
d1d0: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
d1e0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61  CL_ERROR;..  rVa
d1f0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
d200: 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
d210: 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
d220: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
d230: 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  , Tcl_NewDoubleO
d240: 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(rVal));.  ret
d250: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
d260: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
d270: 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53  te3_data_count S
d280: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
d290: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
d2a0: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
d2b0: 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
d2c0: 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
d2d0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
d2e0: 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ata_count(.  voi
d2f0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
d300: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d310: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
d320: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
d330: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
d340: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
d350: 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
d360: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
d370: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d380: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d390: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d3a0: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
d3b0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
d3c0: 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
d3d0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d3e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
d3f0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
d400: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
d410: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d420: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
d430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d440: 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
d450: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
d460: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
d470: 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53  e3_data_count(pS
d480: 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
d490: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
d4a0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
d4b0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
d4c0: 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
d4d0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
d4e0: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
d4f0: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
d500: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
d510: 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
d520: 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
d530: 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75   int test_stmt_u
d540: 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tf8(.  void * cl
d550: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
d560: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
d570: 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
d580: 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20  on to be invoke 
d590: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
d5a0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
d5b0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
d5c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
d5d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
d5e0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
d5f0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
d600: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
d610: 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63  _stmt*, int) = c
d620: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 63 6f 6e  lientData;.  con
d630: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  st char *zRet;..
d640: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
d650: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
d660: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
d670: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
d680: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
d690: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
d6a0: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
d6b0: 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
d6c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d6d0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
d6e0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
d6f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
d700: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
d710: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
d720: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
d730: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
d740: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
d750: 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
d760: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d770: 20 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53   zRet = xFunc(pS
d780: 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28  tmt, col);.  if(
d790: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c   zRet ){.    Tcl
d7a0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
d7b0: 70 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c  p, (char *)zRet,
d7c0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
d7d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d7e0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d7f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54  3_column_text ST
d800: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
d810: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
d820: 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53  olumn_decltype S
d830: 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
d840: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
d850: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54  column_name STMT
d860: 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
d870: 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
d880: 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  utf16(.  void * 
d890: 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
d8a0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
d8b0: 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
d8c0: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
d8d0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
d8e0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
d8f0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
d900: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
d910: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
d920: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
d930: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
d940: 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  t;.  const void 
d950: 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73  *zName16;.  cons
d960: 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29  t void *(*xFunc)
d970: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
d980: 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61 74  int) = clientDat
d990: 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  a;..  if( objc!=
d9a0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
d9b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d9c0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
d9d0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
d9e0: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
d9f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
da00: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
da10: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
da20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
da30: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
da40: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
da50: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
da60: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
da70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
da80: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
da90: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
daa0: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
dab0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
dac0: 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20  R;..  zName16 = 
dad0: 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c  xFunc(pStmt, col
dae0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31 36  );.  if( zName16
daf0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 54   ){.    pRet = T
db00: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
db10: 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71 6c 69  bj(zName16, sqli
db20: 74 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28  te3utf16ByteLen(
db30: 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32 29 3b  zName16, -1)+2);
db40: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
db50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
db60: 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  et);.  }..  retu
db70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
db80: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
db90: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54  e3_column_int ST
dba0: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
dbb0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
dbc0: 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54  olumn_bytes STMT
dbd0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
dbe0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
dbf0: 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54  umn_bytes16 STMT
dc00: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74   column.**.*/.st
dc10: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
dc20: 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  mt_int(.  void *
dc30: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
dc40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
dc50: 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
dc60: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
dc70: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
dc80: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
dc90: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
dca0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
dcb0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
dcc0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
dcd0: 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  ;.  int (*xFunc)
dce0: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
dcf0: 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61 74  int) = clientDat
dd00: 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  a;..  if( objc!=
dd10: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
dd20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dd30: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
dd40: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
dd50: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
dd60: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
dd70: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
dd80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
dd90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
dda0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
ddb0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
ddc0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ddd0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
dde0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ddf0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
de00: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
de10: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
de20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
de30: 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
de40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
de50: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75  cl_NewIntObj(xFu
de60: 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29  nc(pStmt, col)))
de70: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
de80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
de90: 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  e:  sqlite3OsOpe
dea0: 6e 52 65 61 64 57 72 69 74 65 20 3c 66 69 6c 65  nReadWrite <file
deb0: 6e 61 6d 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20  name>.*/.static 
dec0: 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33  int test_sqlite3
ded0: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
dee0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
def0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
df00: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
df10: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
df20: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
df30: 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70 46  ){.  OsFile * pF
df40: 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ile;.  int rc;. 
df50: 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 63 68   int dummy;.  ch
df60: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
df70: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
df80: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
df90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
dfa0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
dfb0: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
dfc0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
dfd0: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c  (objv[0]), " fil
dfe0: 65 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20  ename", 0);.    
dff0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e000: 3b 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65 20 3d  ;.  }..  pFile =
e010: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
e020: 7a 65 6f 66 28 4f 73 46 69 6c 65 29 29 3b 0a 20  zeof(OsFile));. 
e030: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
e040: 70 65 6e 52 65 61 64 57 72 69 74 65 28 54 63 6c  penReadWrite(Tcl
e050: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e060: 31 5d 29 2c 20 70 46 69 6c 65 2c 20 26 64 75 6d  1]), pFile, &dum
e070: 6d 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  my);.  if( rc!=S
e080: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e090: 73 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c 65  sqliteFree(pFile
e0a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  );.    Tcl_SetRe
e0b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
e0c0: 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72  ar *)errorName(r
e0d0: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
e0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e0f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 61 6b  ERROR;.  }.  mak
e100: 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
e110: 72 70 2c 20 7a 42 75 66 2c 20 70 46 69 6c 65 29  rp, zBuf, pFile)
e120: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
e130: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
e140: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
e150: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
e160: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
e170: 4f 73 43 6c 6f 73 65 20 3c 66 69 6c 65 20 68 61  OsClose <file ha
e180: 6e 64 6c 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle>.*/.static 
e190: 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33  int test_sqlite3
e1a0: 4f 73 43 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20  OsClose(.  void 
e1b0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e1c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e1d0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e1e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e1f0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46   objv[].){.  OsF
e200: 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69  ile * pFile;.  i
e210: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
e220: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
e230: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e240: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e250: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e260: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
e270: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
e280: 5d 29 2c 20 22 20 66 69 6c 65 68 61 6e 64 6c 65  ]), " filehandle
e290: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
e2a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e2b0: 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65 50  ..  if( getFileP
e2c0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
e2d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e2e0: 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29  v[1]), &pFile) )
e2f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
e300: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
e310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73   = sqlite3OsClos
e320: 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  e(pFile);.  if( 
e330: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e340: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
e350: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
e360: 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29   *)errorName(rc)
e370: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
e380: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e390: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
e3a0: 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20  eFree(pFile);.  
e3b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
e3c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
e3d0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 20 3c 66  sqlite3OsLock <f
e3e0: 69 6c 65 20 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63  ile handle> <loc
e3f0: 6b 74 79 70 65 3e 0a 2a 2f 0a 73 74 61 74 69 63  ktype>.*/.static
e400: 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65   int test_sqlite
e410: 33 4f 73 4c 6f 63 6b 28 0a 20 20 76 6f 69 64 20  3OsLock(.  void 
e420: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e430: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e440: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e450: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e460: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46   objv[].){.  OsF
e470: 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69  ile * pFile;.  i
e480: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
e490: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
e4a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e4b0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e4c0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e4d0: 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54 63 6c  "", .        Tcl
e4e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e4f0: 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22 20  0]), .        " 
e500: 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48 41 52  filehandle (SHAR
e510: 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45 4e 44  ED|RESERVED|PEND
e520: 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29 22 2c  ING|EXCLUSIVE)",
e530: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
e540: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
e550: 20 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69    if( getFilePoi
e560: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
e570: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e580: 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a  1]), &pFile) ){.
e590: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e5a0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
e5b0: 20 30 3d 3d 73 74 72 63 6d 70 28 22 53 48 41 52   0==strcmp("SHAR
e5c0: 45 44 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ED", Tcl_GetStri
e5d0: 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a  ng(objv[2])) ){.
e5e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e5f0: 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 53 48  OsLock(pFile, SH
e600: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  ARED_LOCK);.  }.
e610: 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 74    else if( 0==st
e620: 72 63 6d 70 28 22 52 45 53 45 52 56 45 44 22 2c  rcmp("RESERVED",
e630: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
e640: 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[2])) ){.    
e650: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
e660: 63 6b 28 70 46 69 6c 65 2c 20 52 45 53 45 52 56  ck(pFile, RESERV
e670: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  ED_LOCK);.  }.  
e680: 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63  else if( 0==strc
e690: 6d 70 28 22 50 45 4e 44 49 4e 47 22 2c 20 54 63  mp("PENDING", Tc
e6a0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e6b0: 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20  [2])) ){.    rc 
e6c0: 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
e6d0: 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 4c  pFile, PENDING_L
e6e0: 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  OCK);.  }.  else
e6f0: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22   if( 0==strcmp("
e700: 45 58 43 4c 55 53 49 56 45 22 2c 20 54 63 6c 5f  EXCLUSIVE", Tcl_
e710: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
e720: 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ])) ){.    rc = 
e730: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46  sqlite3OsLock(pF
e740: 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ile, EXCLUSIVE_L
e750: 4f 43 4b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OCK);.  }else{. 
e760: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e770: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
e780: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
e790: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
e7a0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
e7b0: 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a 20 20 20 20  (objv[0]), .    
e7c0: 20 20 20 20 22 20 66 69 6c 65 68 61 6e 64 6c 65      " filehandle
e7d0: 20 28 53 48 41 52 45 44 7c 52 45 53 45 52 56 45   (SHARED|RESERVE
e7e0: 44 7c 50 45 4e 44 49 4e 47 7c 45 58 43 4c 55 53  D|PENDING|EXCLUS
e7f0: 49 56 45 29 22 2c 20 30 29 3b 0a 20 20 20 20 72  IVE)", 0);.    r
e800: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e810: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
e820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e830: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
e840: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
e850: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
e860: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
e870: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
e890: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
e8a0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73  sage:  sqlite3Os
e8b0: 55 6e 6c 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e  Unlock <file han
e8c0: 64 6c 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle>.*/.static i
e8d0: 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  nt test_sqlite3O
e8e0: 73 55 6e 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20  sUnlock(.  void 
e8f0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e900: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e910: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e920: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e930: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46   objv[].){.  OsF
e940: 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69  ile * pFile;.  i
e950: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
e960: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
e970: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e980: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e990: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e9a0: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
e9b0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
e9c0: 5d 29 2c 20 22 20 66 69 6c 65 68 61 6e 64 6c 65  ]), " filehandle
e9d0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
e9e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e9f0: 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65 50  ..  if( getFileP
ea00: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
ea10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ea20: 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29  v[1]), &pFile) )
ea30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
ea40: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
ea50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
ea60: 63 6b 28 70 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  ck(pFile, NO_LOC
ea70: 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
ea80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
ea90: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
eaa0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72  erp, (char *)err
eab0: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
eac0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
ead0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eae0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
eaf0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  OK;.}.../*.** Re
eb00: 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20  gister commands 
eb10: 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
eb20: 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
eb30: 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
eb40: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
eb50: 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20  terp){.  extern 
eb60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
eb70: 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ch_count;.  exte
eb80: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
eb90: 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a  nterrupt_count;.
eba0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
ebb0: 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  ite3_open_file_c
ebc0: 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
ebd0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
ebe0: 6e 74 5f 74 69 6d 65 3b 0a 20 20 73 74 61 74 69  nt_time;.  stati
ebf0: 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  c struct {.     
ec00: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ec10: 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78    Tcl_CmdProc *x
ec20: 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d  Proc;.  } aCmd[]
ec30: 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c   = {.     { "sql
ec40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
ec50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
ec60: 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
ec70: 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20  e3_mprintf_int  
ec80: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
ec90: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
eca0: 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54 63  64",         (Tc
ecb0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
ecc0: 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
ecd0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
ece0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
ecf0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
ed00: 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
ed10: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20  e3_mprintf_str  
ed20: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
ed30: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
ed40: 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54 63  ble",        (Tc
ed50: 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
ed60: 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
ed70: 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  e },.     { "sql
ed80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
ed90: 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54 63  led",        (Tc
eda0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
edb0: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
edc0: 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  d },.     { "sql
edd0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74  ite3_mprintf_z_t
ede0: 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
edf0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
ee00: 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20  mprintf_z       
ee10: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
ee20: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
ee30: 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c  rowid",     (Tcl
ee40: 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c  _CmdProc*)test_l
ee50: 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20  ast_rowid       
ee60: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
ee70: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c  e3_exec_printf",
ee80: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
ee90: 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
eea0: 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d  ec_printf      }
eeb0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
eec0: 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  3_get_table_prin
eed0: 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43  tf",      (Tcl_C
eee0: 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74  mdProc*)test_get
eef0: 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c  _table_printf },
ef00: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
ef10: 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  _close",        
ef20: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
ef30: 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65  dProc*)sqlite_te
ef40: 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a  st_close     },.
ef50: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
ef60: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22  create_function"
ef70: 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
ef80: 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
ef90: 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20  e_function  },. 
efa0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
efb0: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22  reate_aggregate"
efc0: 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
efd0: 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
efe0: 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20  _aggregate },.  
eff0: 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67     { "sqlite_reg
f000: 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
f010: 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  ion", (Tcl_CmdPr
f020: 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65  oc*)test_registe
f030: 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20  r_func    },.   
f040: 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72    { "sqlite_abor
f050: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
f060: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
f070: 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20  c*)sqlite_abort 
f080: 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 64           },.#ifd
f090: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f0a0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 6d       { "sqlite_m
f0b0: 61 6c 6c 6f 63 5f 66 61 69 6c 22 2c 20 20 20 20  alloc_fail",    
f0c0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
f0d0: 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 6d 61 6c  Proc*)sqlite_mal
f0e0: 6c 6f 63 5f 66 61 69 6c 20 20 20 20 7d 2c 0a 20  loc_fail    },. 
f0f0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61      { "sqlite_ma
f100: 6c 6c 6f 63 5f 73 74 61 74 22 2c 20 20 20 20 20  lloc_stat",     
f110: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
f120: 72 6f 63 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c  roc*)sqlite_mall
f130: 6f 63 5f 73 74 61 74 20 20 20 20 7d 2c 0a 23 65  oc_stat    },.#e
f140: 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
f150: 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20  ite_bind",      
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
f170: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
f180: 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20 20 20  _bind           
f190: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65    },.     { "bre
f1a0: 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20  akpoint",       
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
f1c0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
f1d0: 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20  _breakpoint     
f1e0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74    },.  };.  stat
f1f0: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
f200: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
f210: 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f     Tcl_ObjCmdPro
f220: 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76  c *xProc;.     v
f230: 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b  oid *clientData;
f240: 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d  .  } aObjCmd[] =
f250: 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74   {.     { "sqlit
f260: 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20  e3_bind_int",   
f270: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
f280: 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20 30  bind_int,      0
f290: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
f2a0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c  te3_bind_int64",
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
f2c0: 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20  _bind_int64,    
f2d0: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
f2e0: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
f2f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
f300: 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20  t_bind_double,  
f310: 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
f320: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22  lite3_bind_null"
f330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
f340: 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20  st_bind_null    
f350: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
f360: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
f370: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
f380: 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20 20 20  est_bind_text   
f390: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
f3a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
f3b0: 74 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  t16",           
f3c0: 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36  test_bind_text16
f3d0: 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
f3e0: 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c  "sqlite3_bind_bl
f3f0: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
f400: 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20   test_bind_blob 
f410: 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
f420: 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64   "sqlite3_errcod
f430: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
f440: 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20    test_errcode  
f450: 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
f460: 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
f470: 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
f480: 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20     test_errmsg  
f490: 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
f4a0: 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
f4b0: 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  sg16",          
f4c0: 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31      test_errmsg1
f4d0: 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  6      ,0 },.   
f4e0: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
f4f0: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
f500: 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20       test_open  
f510: 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
f520: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
f530: 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  en16",          
f540: 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31        test_open1
f550: 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 0a  6        ,0 },..
f560: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
f570: 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20  prepare",       
f580: 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
f590: 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c  pare       ,0 },
f5a0: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
f5b0: 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20  _prepare16",    
f5c0: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
f5d0: 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d  epare16     ,0 }
f5e0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
f5f0: 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20  3_finalize",    
f600: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 66            test_f
f610: 69 6e 61 6c 69 7a 65 20 20 20 20 20 20 2c 30 20  inalize      ,0 
f620: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
f630: 65 33 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20  e3_reset",      
f640: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
f650: 72 65 73 65 74 20 20 20 20 20 20 20 20 20 2c 30  reset         ,0
f660: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
f670: 74 65 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20  te3_changes",   
f680: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
f690: 5f 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c  _changes       ,
f6a0: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
f6b0: 69 74 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20  ite3_step",     
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
f6d0: 74 5f 73 74 65 70 20 20 20 20 20 20 20 20 20 20  t_step          
f6e0: 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73  ,0 },..     /* s
f6f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28  qlite3_column_*(
f700: 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20  ) API */.     { 
f710: 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
f720: 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  count",         
f730: 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75   test_column_cou
f740: 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  nt  ,0 },.     {
f750: 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63   "sqlite3_data_c
f760: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
f770: 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e    test_data_coun
f780: 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  t    ,0 },.     
f790: 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
f7a0: 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20  n_type",        
f7b0: 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74     test_column_t
f7c0: 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  ype   ,0 },.    
f7d0: 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
f7e0: 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  mn_blob",       
f7f0: 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
f800: 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20  blob   ,0 },.   
f810: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
f820: 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  umn_double",    
f830: 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
f840: 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20  _double ,0 },.  
f850: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
f860: 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20  lumn_int64",    
f870: 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
f880: 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20  n_int64  ,0 },. 
f890: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
f8a0: 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 20  olumn_int",     
f8b0: 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74     test_stmt_int
f8c0: 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,   sqlite3_colu
f8d0: 6d 6e 5f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  mn_int       },.
f8e0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
f8f0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20  column_bytes",  
f900: 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
f910: 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  t,   sqlite3_col
f920: 75 6d 6e 5f 62 79 74 65 73 20 20 20 20 20 7d 2c  umn_bytes     },
f930: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
f940: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22  _column_bytes16"
f950: 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69  ,    test_stmt_i
f960: 6e 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  nt,   sqlite3_co
f970: 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 20 20 7d  lumn_bytes16   }
f980: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
f990: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20  3_column_text", 
f9a0: 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
f9b0: 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63  utf8,  sqlite3_c
f9c0: 6f 6c 75 6d 6e 5f 74 65 78 74 20 20 20 20 20 20  olumn_text      
f9d0: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
f9e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
f9f0: 70 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74  pe",   test_stmt
fa00: 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f  _utf8,  sqlite3_
fa10: 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20  column_decltype 
fa20: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
fa30: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22  te3_column_name"
fa40: 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d  ,       test_stm
fa50: 74 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33  t_utf8,  sqlite3
fa60: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 20 20 20  _column_name    
fa70: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
fa80: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
fa90: 31 36 22 2c 20 20 20 20 20 74 65 73 74 5f 73 74  16",     test_st
faa0: 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65  mt_utf16, sqlite
fab0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 20  3_column_text16 
fac0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
fad0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
fae0: 6c 74 79 70 65 31 36 22 2c 20 74 65 73 74 5f 73  ltype16", test_s
faf0: 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74  tmt_utf16, sqlit
fb00: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
fb10: 70 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73  pe16},.     { "s
fb20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
fb30: 6d 65 31 36 22 2c 20 20 20 20 20 74 65 73 74 5f  me16",     test_
fb40: 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69  stmt_utf16, sqli
fb50: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
fb60: 36 20 20 20 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a  6    },..     /*
fb70: 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20   Functions from 
fb80: 6f 73 2e 68 20 2a 2f 0a 20 20 20 20 20 7b 20 22  os.h */.     { "
fb90: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
fba0: 64 57 72 69 74 65 22 2c 74 65 73 74 5f 73 71 6c  dWrite",test_sql
fbb0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
fbc0: 69 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ite, 0 },.     {
fbd0: 20 22 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65   "sqlite3OsClose
fbe0: 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ",        test_s
fbf0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30  qlite3OsClose, 0
fc00: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
fc10: 74 65 33 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20  te3OsLock",     
fc20: 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33      test_sqlite3
fc30: 4f 73 4c 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20  OsLock, 0 },.   
fc40: 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 55 6e    { "sqlite3OsUn
fc50: 6c 6f 63 6b 22 2c 20 20 20 20 20 20 20 74 65 73  lock",       tes
fc60: 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  t_sqlite3OsUnloc
fc70: 6b 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  k, 0 },.     { "
fc80: 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
fc90: 22 2c 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c  ",      test_col
fca0: 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20  late, 0         
fcb0: 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  },.     { "add_t
fcc0: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  est_function",  
fcd0: 20 20 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e     test_function
fce0: 2c 20 30 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  , 0         },. 
fcf0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
fd00: 72 61 73 68 70 61 72 61 6d 73 22 2c 20 20 20 20  rashparams",    
fd10: 20 73 71 6c 69 74 65 33 5f 63 72 61 73 68 70 61   sqlite3_crashpa
fd20: 72 61 6d 73 2c 20 30 20 20 20 20 20 20 20 20 20  rams, 0         
fd30: 7d 2c 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  },..  };.  int i
fd40: 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
fd50: 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b  qlite3_os_trace;
fd60: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ..  for(i=0; i<s
fd70: 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65  izeof(aCmd)/size
fd80: 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b  of(aCmd[0]); i++
fd90: 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
fda0: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
fdb0: 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20   aCmd[i].zName, 
fdc0: 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30  aCmd[i].xProc, 0
fdd0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  , 0);.  }.  for(
fde0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
fdf0: 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f  bjCmd)/sizeof(aO
fe00: 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  bjCmd[0]); i++){
fe10: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
fe20: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
fe30: 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61  , aObjCmd[i].zNa
fe40: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62  me, .        aOb
fe50: 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61  jCmd[i].xProc, a
fe60: 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74  ObjCmd[i].client
fe70: 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Data, 0);.  }.  
fe80: 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
fe90: 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72  rp, "sqlite_sear
fea0: 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ch_count", .    
feb0: 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
fec0: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20  3_search_count, 
fed0: 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
fee0: 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
fef0: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74  erp, "sqlite_int
ff00: 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a  errupt_count", .
ff10: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
ff20: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
ff30: 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
ff40: 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
ff50: 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
ff60: 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  ite_open_file_co
ff70: 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
ff80: 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
ff90: 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43  n_file_count, TC
ffa0: 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
ffb0: 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
ffc0: 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65  p, "sqlite_curre
ffd0: 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20  nt_time", .     
ffe0: 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
fff0: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54  _current_time, T
10000 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
10010 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
10020 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
10030 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
10040 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f  ar*)&sqlite3_os_
10050 74 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  trace, TCL_LINK_
10060 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
10070 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
10080 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
10090 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20 28 63  value",.      (c
100a0 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61  har*)&sqlite_sta
100b0 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20  tic_bind_value, 
100c0 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29  TCL_LINK_STRING)
100d0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
100e0 4b 3b 0a 7d 0a                                   K;.}.