/ Hex Artifact Content
Login

Artifact 470430e194e43abb7d05b993fb360344f3d58834:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 70  or testing the p
0190: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
01a0: 65 20 74 6f 20 53 51 4c 69 74 65 2e 20 20 54 68  e to SQLite.  Th
01b0: 69 73 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f  is code.** is no
01c0: 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  t included in th
01d0: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
01e0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 66 6f  .  It is used fo
01f0: 72 20 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74  r automated.** t
0200: 65 73 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51  esting of the SQ
0210: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a  Lite library..**
0220: 0a 2a 2a 20 24 49 64 3a 20 74 65 73 74 31 2e 63  .** $Id: test1.c
0230: 2c 76 20 31 2e 39 32 20 32 30 30 34 2f 30 36 2f  ,v 1.92 2004/06/
0240: 33 30 20 30 38 3a 32 30 3a 31 36 20 64 61 6e 69  30 08:20:16 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 63 61     break;.    ca
0e00: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
0e10: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
0e20: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
0e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0e40: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
0e50: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
0e60: 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e   "SQLITE_Unknown
0e70: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
0e80: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
0e90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0ea0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0eb0: 6e 20 73 71 6c 69 74 65 20 6f 62 6a 65 63 74 2e  n sqlite object.
0ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0ed0: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
0ee0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0ef0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
0f00: 73 71 6c 69 74 65 20 2a 2a 70 70 44 62 29 7b 0a  sqlite **ppDb){.
0f10: 20 20 69 66 28 20 73 73 63 61 6e 66 28 7a 41 2c    if( sscanf(zA,
0f20: 20 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64 2a   PTR_FMT, (void*
0f30: 2a 29 70 70 44 62 29 21 3d 31 20 26 26 20 0a 20  *)ppDb)!=1 && . 
0f40: 20 20 20 20 20 28 7a 41 5b 30 5d 21 3d 27 30 27       (zA[0]!='0'
0f50: 20 7c 7c 20 7a 41 5b 31 5d 21 3d 27 78 27 20 7c   || zA[1]!='x' |
0f60: 7c 20 73 73 63 61 6e 66 28 26 7a 41 5b 32 5d 2c  | sscanf(&zA[2],
0f70: 20 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64 2a   PTR_FMT, (void*
0f80: 2a 29 70 70 44 62 29 21 3d 31 29 0a 20 20 29 7b  *)ppDb)!=1).  ){
0f90: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
0fa0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 5c  esult(interp, "\
0fb0: 22 22 2c 20 7a 41 2c 20 22 5c 22 20 69 73 20 6e  "", zA, "\" is n
0fc0: 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ot a valid point
0fd0: 65 72 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  er value", 0);. 
0fe0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0ff0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
1000: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1010: 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e  ** Decode a poin
1020: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1030: 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a  3_stmt object..*
1040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1050: 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54  StmtPointer(.  T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1070: 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
1080: 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69   *zArg,  .  sqli
1090: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
10a0: 74 0a 29 7b 0a 20 20 69 66 28 20 73 73 63 61 6e  t.){.  if( sscan
10b0: 66 28 7a 41 72 67 2c 20 50 54 52 5f 46 4d 54 2c  f(zArg, PTR_FMT,
10c0: 20 28 76 6f 69 64 2a 2a 29 70 70 53 74 6d 74 29   (void**)ppStmt)
10d0: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=1 ){.    Tcl_A
10e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10f0: 72 70 2c 20 22 5c 22 22 2c 20 7a 41 72 67 2c 20  rp, "\"", zArg, 
1100: 22 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  "\" is not a val
1110: 69 64 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  id pointer value
1120: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1130: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1140: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
1160: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
1170: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
1180: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
1190: 20 69 6e 74 20 67 65 74 46 69 6c 65 50 6f 69 6e   int getFilePoin
11a0: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
11b0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
11c0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
11d0: 20 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 70 46   .  OsFile **ppF
11e0: 69 6c 65 0a 29 7b 0a 20 20 69 66 28 20 73 73 63  ile.){.  if( ssc
11f0: 61 6e 66 28 7a 41 72 67 2c 20 50 54 52 5f 46 4d  anf(zArg, PTR_FM
1200: 54 2c 20 28 76 6f 69 64 2a 2a 29 70 70 46 69 6c  T, (void**)ppFil
1210: 65 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  e)!=1 ){.    Tcl
1220: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1230: 74 65 72 70 2c 20 22 5c 22 22 2c 20 7a 41 72 67  terp, "\"", zArg
1240: 2c 20 22 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  , "\" is not a v
1250: 61 6c 69 64 20 70 6f 69 6e 74 65 72 20 76 61 6c  alid pointer val
1260: 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ue", 0);.    ret
1270: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1280: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1290: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  OK;.}../*.** Gen
12a0: 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65 70  erate a text rep
12b0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
12c0: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63 61   pointer that ca
12d0: 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64 0a  n be understood.
12e0: 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62 50  ** by the getDbP
12f0: 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56 6d  ointer and getVm
1300: 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65 73  Pointer routines
1310: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   above..**.** Th
1320: 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e  e problem is, on
1330: 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20 28   some machines (
1340: 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75 20  Solaris) if you 
1350: 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74 68  do a printf with
1360: 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61 6e  .** "%p" you can
1370: 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64 20  not turn around 
1380: 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20 77  and do a scanf w
1390: 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25 70  ith the same "%p
13a0: 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f 75  " and.** get you
13b0: 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e 20  r pointer back. 
13c0: 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72 65   You have to pre
13d0: 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66 6f  pend a "0x" befo
13e0: 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f  re it will.** wo
13f0: 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73 74  rk.  Or at least
1400: 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69 73   that is what is
1410: 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
1420: 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69 73  (drh).  But this
1430: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61 72  .** behavior var
1440: 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e 65  ies from machine
1450: 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54 68   to machine.  Th
1460: 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64 20  e solution used 
1470: 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65 73  her is.** to tes
1480: 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69 67  t the string rig
1490: 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20 67  ht after it is g
14a0: 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65 20  enerated to see 
14b0: 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20  if it can be.** 
14c0: 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73 63  understood by sc
14d0: 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c  anf, and if not,
14e0: 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67 20   try prepending 
14f0: 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20 69  an "0x" to see i
1500: 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73 2e  f.** that helps.
1510: 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f 72    If nothing wor
1520: 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72 6f  ks, a fatal erro
1530: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  r is generated..
1540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
1550: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c  kePointerStr(Tcl
1560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1570: 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69   char *zPtr, voi
1580: 64 20 2a 70 29 7b 0a 20 20 76 6f 69 64 20 2a 70  d *p){.  void *p
1590: 32 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 50 74  2;.  sprintf(zPt
15a0: 72 2c 20 50 54 52 5f 46 4d 54 2c 20 70 29 3b 0a  r, PTR_FMT, p);.
15b0: 20 20 69 66 28 20 73 73 63 61 6e 66 28 7a 50 74    if( sscanf(zPt
15c0: 72 2c 20 50 54 52 5f 46 4d 54 2c 20 26 70 32 29  r, PTR_FMT, &p2)
15d0: 21 3d 31 20 7c 7c 20 70 32 21 3d 70 20 29 7b 0a  !=1 || p2!=p ){.
15e0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 50 74 72      sprintf(zPtr
15f0: 2c 20 22 30 78 22 20 50 54 52 5f 46 4d 54 2c 20  , "0x" PTR_FMT, 
1600: 70 29 3b 0a 20 20 20 20 69 66 28 20 73 73 63 61  p);.    if( ssca
1610: 6e 66 28 7a 50 74 72 2c 20 50 54 52 5f 46 4d 54  nf(zPtr, PTR_FMT
1620: 2c 20 26 70 32 29 21 3d 31 20 7c 7c 20 70 32 21  , &p2)!=1 || p2!
1630: 3d 70 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =p ){.      Tcl_
1640: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1650: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
1660: 63 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  convert a pointe
1670: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 22 0a  r to a string ".
1680: 20 20 20 20 20 20 20 20 20 22 69 6e 20 74 68 65           "in the
1690: 20 66 69 6c 65 20 22 20 5f 5f 46 49 4c 45 5f 5f   file " __FILE__
16a0: 20 22 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6d   " in function m
16b0: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 29 2e  akePointerStr().
16c0: 20 20 50 6c 65 61 73 65 20 22 0a 20 20 20 20 20    Please ".     
16d0: 20 20 20 20 22 72 65 70 6f 72 74 20 74 68 69 73      "report this
16e0: 20 70 72 6f 62 6c 65 6d 20 74 6f 20 74 68 65 20   problem to the 
16f0: 53 51 4c 69 74 65 20 6d 61 69 6c 69 6e 67 20 6c  SQLite mailing l
1700: 69 73 74 20 6f 72 20 61 73 20 61 20 6e 65 77 20  ist or as a new 
1710: 62 75 74 20 22 0a 20 20 20 20 20 20 20 20 20 22  but ".         "
1720: 72 65 70 6f 72 74 2e 20 20 50 6c 65 61 73 65 20  report.  Please 
1730: 70 72 6f 76 69 64 65 20 64 65 74 61 69 6c 65 64  provide detailed
1740: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1750: 75 74 20 68 6f 77 20 79 6f 75 20 63 6f 6d 70 69  ut how you compi
1760: 6c 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 22  led ".         "
1770: 53 51 4c 69 74 65 20 61 6e 64 20 77 68 61 74 20  SQLite and what 
1780: 63 6f 6d 70 75 74 65 72 20 79 6f 75 20 61 72 65  computer you are
1790: 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e 22 2c 20 30   running on.", 0
17a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
17c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
17d0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
17e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
17f0: 69 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ine for sqlite3_
1800: 65 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a  exec_printf()..*
1810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65  /.static int exe
1820: 63 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64  c_printf_cb(void
1830: 20 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63   *pArg, int argc
1840: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
1850: 68 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54  har **name){.  T
1860: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20  cl_DString *str 
1870: 3d 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29  = (Tcl_DString*)
1880: 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  pArg;.  int i;..
1890: 20 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e    if( Tcl_DStrin
18a0: 67 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20  gLength(str)==0 
18b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
18c0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
18d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41      Tcl_DStringA
18e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72  ppendElement(str
18f0: 2c 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65  , name[i] ? name
1900: 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20  [i] : "NULL");. 
1910: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
1920: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
1930: 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  {.    Tcl_DStrin
1940: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73  gAppendElement(s
1950: 74 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72  tr, argv[i] ? ar
1960: 67 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b  gv[i] : "NULL");
1970: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1990: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70    sqlite3_exec_p
19a0: 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41  rintf  DB  FORMA
19b0: 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  T  STRING.**.** 
19c0: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
19d0: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29  e3_exec_printf()
19e0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
19f0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1a00: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
1a10: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
1a20: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
1a30: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
1a40: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
1a50: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
1a60: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
1a70: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
1a80: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
1a90: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63  ic int test_exec
1aa0: 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20  _printf(.  void 
1ab0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1ac0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1ad0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1ae0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1af0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1b00: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
1b10: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1b20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1b30: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
1b40: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
1b50: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
1b60: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1b70: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
1b80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
1b90: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
1ba0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
1bb0: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1bc0: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
1bd0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1be0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1bf0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1c00: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1c10: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
1c20: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
1c30: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c50: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1c60: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1c70: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1c80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1c90: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
1ca0: 73 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  str);.  rc = sql
1cb0: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1cc0: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 65 78  (db, argv[2], ex
1cd0: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
1ce0: 74 72 2c 20 26 7a 45 72 72 2c 20 61 72 67 76 5b  tr, &zErr, argv[
1cf0: 33 5d 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  3]);.  sprintf(z
1d00: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
1d10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
1d20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
1d30: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
1d40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
1d50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
1d60: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
1d70: 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20  &str) : zErr);. 
1d80: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
1d90: 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45  (&str);.  if( zE
1da0: 72 72 20 29 20 66 72 65 65 28 7a 45 72 72 29 3b  rr ) free(zErr);
1db0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1dd0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
1de0: 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41 52  tf_z_test  SEPAR
1df0: 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47 31  ATOR  ARG0  ARG1
1e00: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20   ....**.** Test 
1e10: 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66  the %z format of
1e20: 20 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65   mprintf().  Use
1e30: 20 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74   multiple mprint
1e40: 66 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  f() calls to .**
1e50: 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67   concatenate arg
1e60: 30 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75  0 through argn u
1e70: 73 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61  sing separator a
1e80: 73 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e  s the separator.
1e90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1ea0: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
1eb0: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
1ec0: 66 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_z(.  void *Not
1ed0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
1ee0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1ef0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1f00: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1f10: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1f20: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f40: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1f50: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
1f60: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
1f70: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
1f80: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
1f90: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20  char *zResult = 
1fa0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  0;.  int i;..  f
1fb0: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20  or(i=2; i<argc; 
1fc0: 69 2b 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c  i++){.    zResul
1fd0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1fe0: 74 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65  tf("%z%s%s", zRe
1ff0: 73 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61  sult, argv[1], a
2000: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54  rgv[i]);.  }.  T
2010: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2020: 69 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c  interp, zResult,
2030: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
2040: 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  e(zResult);.  re
2050: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2060: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2070: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
2080: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
2090: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
20a0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
20b0: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
20c0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
20d0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
20e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
20f0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
2100: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
2110: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
2120: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
2130: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
2140: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
2150: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
2160: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
2170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
2180: 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
2190: 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tf(.  void *NotU
21a0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
21b0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
21c0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
21d0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
21e0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
21f0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
2200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2210: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2220: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
2230: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
2240: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
2250: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
2260: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 54 63 6c  qlite *db;.  Tcl
2270: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
2280: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
2290: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
22a0: 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68  nRow, nCol;.  ch
22b0: 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20  ar **aResult;.  
22c0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
22d0: 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72  uf[30];.  if( ar
22e0: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
22f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2300: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2310: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2320: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
2330: 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54       " DB FORMAT
2340: 20 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20   STRING", 0);.  
2350: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2360: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2370: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2380: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2390: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
23a0: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
23b0: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
23c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  rc = sqlite3_get
23d0: 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 64 62  _table_printf(db
23e0: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 61 52 65 73  , argv[2], &aRes
23f0: 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f  ult, &nRow, &nCo
2400: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
2410: 20 20 20 26 7a 45 72 72 2c 20 61 72 67 76 5b 33     &zErr, argv[3
2420: 5d 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  ]);.  sprintf(zB
2430: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
2440: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
2450: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
2460: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2470: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72  TE_OK ){.    spr
2480: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
2490: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f   nRow);.    Tcl_
24a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
24b0: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20  terp, zBuf);.   
24c0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
24d0: 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  %d", nCol);.    
24e0: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
24f0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
2500: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2510: 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69  (nRow+1)*nCol; i
2520: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ++){.      Tcl_A
2530: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2540: 65 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20  erp, aResult[i] 
2550: 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22  ? aResult[i] : "
2560: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20  NULL");.    }.  
2570: 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41  }else{.    Tcl_A
2580: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2590: 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  erp, zErr);.  }.
25a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74    sqlite3_free_t
25b0: 61 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20  able(aResult);. 
25c0: 20 69 66 28 20 7a 45 72 72 20 29 20 66 72 65 65   if( zErr ) free
25d0: 28 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e  (zErr);.  return
25e0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
25f0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
2600: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
2610: 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  owid DB.**.** Re
2620: 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67 65  turns the intege
2630: 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  r ROWID of the m
2640: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
2650: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2660: 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64   test_last_rowid
2670: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2680: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2690: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
26a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
26b0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
26c0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
26d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
26e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2700: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2720: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2730: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2740: 69 74 65 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  ite *db;.  char 
2750: 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28  zBuf[30];..  if(
2760: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
2770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2780: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2790: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
27a0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
27b0: 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " DB\"", 0);.   
27c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27d0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
27e0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
27f0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2800: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2810: 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  OR;.  sprintf(zB
2820: 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69  uf, "%lld", sqli
2830: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
2840: 72 6f 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63  rowid(db));.  Tc
2850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2860: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
2870: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2880: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
2890: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c  age:  sqlite3_cl
28a0: 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  ose DB.**.** Clo
28b0: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
28c0: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
28d0: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
28e0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
28f0: 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64  st_close(.  void
2900: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2910: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2920: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2930: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2940: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2950: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2960: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2970: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2980: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2990: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
29a0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
29b0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
29c0: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
29d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
29e0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
29f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a00: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a10: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a20: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
2a30: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
2a40: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
2a50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a60: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2a70: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2a80: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2aa0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2ab0: 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54 63 6c  close(db);.  Tcl
2ac0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2ad0: 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72  p, (char *)error
2ae0: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
2af0: 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
2b00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2b10: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2b20: 6f 66 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63  of the x_coalesc
2b30: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  e() function..**
2b40: 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   Return the firs
2b50: 74 20 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e  t argument non-N
2b60: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
2b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 66 6e  .static void ifn
2b80: 75 6c 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  ullFunc(sqlite3_
2b90: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2ba0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
2bb0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
2bc0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
2bd0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
2be0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
2bf0: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
2c00: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
2c10: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 73  v[i]) ){.      s
2c20: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
2c30: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
2c40: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2c50: 72 67 76 5b 69 5d 29 2c 20 2d 31 2c 0a 20 20 20  rgv[i]), -1,.   
2c60: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
2c70: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
2c80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  .}../*.** A stru
2ca0: 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63 68  cture into which
2cb0: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 74   to accumulate t
2cc0: 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64  ext..*/.struct d
2cd0: 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c  str {.  int nAll
2ce0: 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61 6c  oc;  /* Space al
2cf0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
2d00: 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70 61   nUsed;   /* Spa
2d10: 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  ce used */.  cha
2d20: 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65  r *z;     /* The
2d30: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
2d40: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
2d50: 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61  to a dstr.*/.sta
2d60: 74 69 63 20 76 6f 69 64 20 64 73 74 72 41 70 70  tic void dstrApp
2d70: 65 6e 64 28 73 74 72 75 63 74 20 64 73 74 72 20  end(struct dstr 
2d80: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
2d90: 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29 7b  z, int divider){
2da0: 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65  .  int n = strle
2db0: 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  n(z);.  if( p->n
2dc0: 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70  Used + n + 2 > p
2dd0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
2de0: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  char *zNew;.    
2df0: 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  p->nAlloc = p->n
2e00: 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30  Alloc*2 + n + 20
2e10: 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71  0;.    zNew = sq
2e20: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e 7a  liteRealloc(p->z
2e30: 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20  , p->nAlloc);.  
2e40: 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b    if( zNew==0 ){
2e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
2e60: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d  e(p->z);.      m
2e70: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
2e80: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
2e90: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2ea0: 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20   p->z = zNew;.  
2eb0: 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20  }.  if( divider 
2ec0: 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  && p->nUsed>0 ){
2ed0: 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  .    p->z[p->nUs
2ee0: 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b  ed++] = divider;
2ef0: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
2f00: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a  ->z[p->nUsed], z
2f10: 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73  , n+1);.  p->nUs
2f20: 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  ed += n;.}../*.*
2f30: 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61  * Invoked for ea
2f40: 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  ch callback from
2f50: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
2f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2f70: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28  xecFuncCallback(
2f80: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
2f90: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
2fa0: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
2fb0: 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  ed){.  struct ds
2fc0: 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  tr *p = (struct 
2fd0: 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69  dstr*)pData;.  i
2fe0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
2ff0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
3000: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
3010: 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41  0 ){.      dstrA
3020: 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c  ppend(p, "NULL",
3030: 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ' ');.    }else
3040: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
3050: 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27  nd(p, argv[i], '
3060: 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   ');.    }.  }. 
3070: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3080: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
3090: 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69  on of the x_sqli
30a0: 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69  te_exec() functi
30b0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
30c0: 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69  on takes.** a si
30d0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e  ngle argument an
30e0: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  d attempts to ex
30f0: 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d  ecute that argum
3100: 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e  ent as SQL code.
3110: 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65  .** This is ille
3120: 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73  gal and should s
3130: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  et the SQLITE_MI
3140: 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65  SUSE flag on the
3150: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
3160: 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57   2004-Jan-07:  W
3170: 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74  e have changed t
3180: 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c  his to make it l
3190: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
31a0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
31b0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e  rom within a fun
31c0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a  ction call.  .**
31d0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
31e0: 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20  e simulates the 
31f0: 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67  effect of having
3200: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74   two threads att
3210: 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74  empt to.** use t
3220: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
3230: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3240: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
3250: 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  d sqlite3ExecFun
3260: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
3270: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
3280: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
3290: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
32a0: 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74  argv.){.  struct
32b0: 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65   dstr x;.  memse
32c0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
32d0: 78 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  x));.  sqlite3_e
32e0: 78 65 63 28 28 73 71 6c 69 74 65 2a 29 73 71 6c  xec((sqlite*)sql
32f0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
3300: 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20 73  ontext),.      s
3310: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3320: 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20  t(argv[0]),.    
3330: 20 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61    execFuncCallba
3340: 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71  ck, &x, 0);.  sq
3350: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
3360: 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20  t(context, x.z, 
3370: 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f  x.nUsed, SQLITE_
3380: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
3390: 6c 69 74 65 46 72 65 65 28 78 2e 7a 29 3b 0a 7d  liteFree(x.z);.}
33a0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
33b0: 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61  sqlite_test_crea
33c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
33d0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
33e0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
33f0: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
3400: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
3410: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
3420: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
3430: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
3440: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
3450: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
3460: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
3470: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
3480: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
3490: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
34a0: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
34b0: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
34c0: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
34d0: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
34e0: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
34f0: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
3500: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
3510: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
3520: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
3530: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
3540: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
3550: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
3560: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
3570: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
3580: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
3590: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
35a0: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
35b0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
35c0: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
35d0: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
35e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
35f0: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
3600: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
3610: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
3620: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
3630: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
3640: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
3650: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
3660: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
3670: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
3680: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
3690: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
36a0: 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  on(.  void *NotU
36b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
36c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
36d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
36e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
36f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3700: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3720: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3730: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3740: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3750: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3760: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
3770: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 73 71 6c  qlite *db;.  sql
3780: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
3790: 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20  ;.  extern void 
37a0: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
37b0: 69 74 65 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72  ite*);..  if( ar
37c0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
37d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
37e0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
37f0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
3800: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
3810: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
3820: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
3830: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3840: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3850: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3860: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3870: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3880: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
3890: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63  unction(db, "x_c
38a0: 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53 51  oalesce", -1, SQ
38b0: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20  LITE_ANY, 0, .  
38c0: 20 20 20 20 69 66 6e 75 6c 6c 46 75 6e 63 2c 20      ifnullFunc, 
38d0: 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 55 73 65  0, 0);..  /* Use
38e0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
38f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29  ate_function16()
3900: 20 41 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c   API here. Mainl
3910: 79 20 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61  y for fun, but a
3920: 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73  lso .  ** becaus
3930: 65 20 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74  e it is not test
3940: 65 64 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65  ed anywhere else
3950: 2e 20 2a 2f 0a 20 20 70 56 61 6c 20 3d 20 73 71  . */.  pVal = sq
3960: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b  lite3ValueNew();
3970: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
3980: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
3990: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
39a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
39b0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
39c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
39d0: 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20 73 71  unction16(db, sq
39e0: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
39f0: 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Val, SQLITE_UTF1
3a00: 36 4e 41 54 49 56 45 29 2c 0a 20 20 20 20 20 20  6NATIVE),.      
3a10: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c  1, SQLITE_UTF16,
3a20: 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63   db, sqlite3Exec
3a30: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73  Func, 0, 0);.  s
3a40: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
3a50: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
3a60: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
3a70: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
3a80: 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f 75  lement the x_cou
3a90: 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66  nt() aggregate f
3aa0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  unction..*/.type
3ab0: 64 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74  def struct Count
3ac0: 43 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74  Ctx CountCtx;.st
3ad0: 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a  ruct CountCtx {.
3ae0: 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74    int n;.};.stat
3af0: 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74 65  ic void countSte
3b00: 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
3b10: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
3b20: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
3b30: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43  lue **argv){.  C
3b40: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
3b50: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
3b60: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
3b70: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
3b80: 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30  ;.  if( (argc==0
3b90: 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   || SQLITE_NULL!
3ba0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
3bb0: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 26  ype(argv[0]) ) &
3bc0: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
3bd0: 2b 3b 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74  +;.  }.}   .stat
3be0: 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e  ic void countFin
3bf0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
3c00: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
3c10: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
3c20: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
3c30: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3c40: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
3c50: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
3c60: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
3c70: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
3c80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
3c90: 65 3a 20 20 73 71 6c 69 74 65 5f 74 65 73 74 5f  e:  sqlite_test_
3ca0: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
3cb0: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
3cc0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
3cd0: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
3ce0: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
3cf0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
3d00: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
3d10: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
3d20: 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e  ount".  This fun
3d30: 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73  ction does the s
3d40: 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20  ame thing.** as 
3d50: 74 68 65 20 22 6d 64 35 73 75 6d 22 20 66 75 6e  the "md5sum" fun
3d60: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
3d70: 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61   original motiva
3d80: 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f  tion for this ro
3d90: 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20  utine was to be 
3da0: 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  able to call the
3db0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  .** sqlite3_crea
3dc0: 74 65 5f 61 67 67 72 65 67 61 74 65 20 66 75 6e  te_aggregate fun
3dd0: 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75  ction while a qu
3de0: 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65  ery is in progre
3df0: 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74  ss in order.** t
3e00: 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54  o test the SQLIT
3e10: 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69  E_MISUSE detecti
3e20: 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61  on logic..*/.sta
3e30: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
3e40: 61 74 65 5f 61 67 67 72 65 67 61 74 65 28 0a 20  ate_aggregate(. 
3e50: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
3e60: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3e70: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
3e80: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
3e90: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
3ea0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
3eb0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
3ec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3ed0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
3ee0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
3ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
3f00: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
3f10: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
3f20: 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
3f30: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
3f40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3f50: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3f60: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3f70: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
3f80: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
3f90: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
3fa0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
3fb0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
3fc0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
3fd0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
3fe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
3ff0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
4000: 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75  ction(db, "x_cou
4010: 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  nt", 0, SQLITE_U
4020: 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  TF8, 0, 0,.     
4030: 20 63 6f 75 6e 74 53 74 65 70 2c 63 6f 75 6e 74   countStep,count
4040: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c  Finalize);.  sql
4050: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
4060: 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e  tion(db, "x_coun
4070: 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  t", 1, SQLITE_UT
4080: 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  F8, 0, 0,.      
4090: 63 6f 75 6e 74 53 74 65 70 2c 63 6f 75 6e 74 46  countStep,countF
40a0: 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 72 65 74 75  inalize);.  retu
40b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
40c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
40d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
40e0: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
40f0: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
4100: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
4110: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
4120: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
4130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4140: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
4150: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
4160: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4170: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4180: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4190: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
41a0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
41b0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
41c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
41d0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
41e0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
41f0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4200: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4210: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
4220: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
4230: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
4240: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
4250: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4260: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4270: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
4280: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
4290: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
42a0: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
42b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
42c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
42d0: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
42e0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
42f0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
4300: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
4310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4320: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
4330: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
4340: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
4350: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
4360: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4370: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
4380: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
4390: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
43a0: 2f 2a 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 72 65  /*.** If zNum re
43b0: 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74 65  presents an inte
43c0: 67 65 72 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ger that will fi
43d0: 74 20 69 6e 20 36 34 2d 62 69 74 73 2c 20 74 68  t in 64-bits, th
43e0: 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 56 61 6c 75  en set.** *pValu
43f0: 65 20 74 6f 20 74 68 61 74 20 69 6e 74 65 67 65  e to that intege
4400: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72 75  r and return tru
4410: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65  e.  Otherwise re
4420: 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73  turn false..*/.s
4430: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
4440: 33 47 65 74 49 6e 74 36 34 28 63 6f 6e 73 74 20  3GetInt64(const 
4450: 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34 20  char *zNum, i64 
4460: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 66 28 20  *pValue){.  if( 
4470: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42  sqlite3FitsIn64B
4480: 69 74 73 28 7a 4e 75 6d 29 20 29 7b 0a 20 20 20  its(zNum) ){.   
4490: 20 73 71 6c 69 74 65 33 61 74 6f 69 36 34 28 7a   sqlite3atoi64(z
44a0: 4e 75 6d 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  Num, pValue);.  
44b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
44c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
44d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
44e0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
44f0: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
4500: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
4510: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
4520: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
4530: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
4540: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
4550: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
4560: 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20  printf_int64(.  
4570: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4580: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4590: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
45a0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
45b0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
45c0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
45d0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
45e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
45f0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
4600: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4610: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4620: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4630: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
4640: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61    sqlite_int64 a
4650: 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [3];.  char *z;.
4660: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
4670: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
4680: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
4690: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
46a0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
46b0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
46c0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
46d0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
46e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
46f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
4700: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
4710: 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36   !sqlite3GetInt6
4720: 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  4(argv[i], &a[i-
4730: 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  2]) ){.      Tcl
4740: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4750: 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20  terp, "argument 
4760: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36  is not a valid 6
4770: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20  4-bit integer", 
4780: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
4790: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
47a0: 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  }.  }.  z = sqli
47b0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
47c0: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
47d0: 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[2]);.  Tcl_Ap
47e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
47f0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
4800: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
4810: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
4820: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
4830: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
4840: 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  tr FORMAT INTEGE
4850: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
4860: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
4870: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
4880: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
4890: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
48a0: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
48b0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
48c0: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
48d0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
48e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
48f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
4900: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
4910: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4920: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4930: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4940: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4950: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4960: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4970: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4980: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4990: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
49a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
49b0: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
49c0: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
49d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
49e0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
49f0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4a00: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
4a10: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
4a20: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
4a30: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
4a40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
4a50: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
4a60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
4a70: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
4a80: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
4a90: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4aa0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
4ab0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
4ac0: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
4ad0: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
4ae0: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
4af0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4b00: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
4b10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4b20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
4b30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4b40: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
4b50: 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20  intf_str FORMAT 
4b60: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
4b70: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
4b80: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
4b90: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
4ba0: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75  ents and one dou
4bb0: 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ble argument.*/.
4bc0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
4bd0: 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
4be0: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
4bf0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4c00: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4c10: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4c20: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4c30: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4c40: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4c60: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4c70: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
4c80: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
4c90: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
4ca0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
4cb0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75  t a[3], i;.  dou
4cc0: 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ble r;.  char *z
4cd0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
4ce0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4cf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4d00: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4d10: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4d20: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
4d30: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 53  FORMAT INT INT S
4d40: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
4d50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4d60: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
4d70: 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<4; i++){.  
4d80: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
4d90: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
4da0: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &a[i-2]) ) ret
4db0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4dc0: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
4dd0: 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61  Double(interp, a
4de0: 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20 72 65  rgv[4], &r) ) re
4df0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4e00: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
4e10: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
4e20: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20  [0], a[1], r);. 
4e30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4e40: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
4e50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4e60: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
4e70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4e80: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
4e90: 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54  rintf_str FORMAT
4ea0: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
4eb0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
4ec0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
4ed0: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
4ee0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
4ef0: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
4f00: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
4f10: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
4f20: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
4f30: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
4f40: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
4f50: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
4f60: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
4f70: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
4f80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4f90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
4fa0: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
4fb0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4fc0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4fd0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4fe0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4ff0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5000: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5020: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
5030: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
5040: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
5050: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
5060: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
5070: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
5080: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
5090: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
50a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
50b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
50c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
50d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
50e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
50f0: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
5100: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
5110: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5120: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
5130: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
5140: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
5150: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
5160: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
5170: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5180: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
5190: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
51a0: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
51b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
51c0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
51d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
51e0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
51f0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
5200: 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c  sage: sqlite_mal
5210: 6c 6f 63 5f 66 61 69 6c 20 4e 0a 2a 2a 0a 2a 2a  loc_fail N.**.**
5220: 20 52 69 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   Rig sqliteMallo
5230: 63 28 29 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  c() to fail on t
5240: 68 65 20 4e 2d 74 68 20 63 61 6c 6c 2e 20 20 54  he N-th call.  T
5250: 75 72 6e 20 6f 66 66 20 74 68 69 73 20 6d 65 63  urn off this mec
5260: 68 61 6e 69 73 6d 0a 2a 2a 20 61 6e 64 20 72 65  hanism.** and re
5270: 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  set the sqlite3_
5280: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 76 61  malloc_failed va
5290: 72 69 61 62 6c 65 20 69 73 20 4e 3d 3d 30 2e 0a  riable is N==0..
52a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
52b0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
52c0: 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  t sqlite_malloc_
52d0: 66 61 69 6c 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  fail(.  void *No
52e0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
52f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
5300: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
5310: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
5320: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5330: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5350: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
5360: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
5370: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
5380: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
5390: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
53a0: 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 61 72   int n;.  if( ar
53b0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
53c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
53d0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
53e0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
53f0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 4e  "", argv[0], " N
5400: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
5410: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5420: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
5430: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
5440: 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72  [1], &n) ) retur
5450: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
5460: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
5470: 69 6c 20 3d 20 6e 3b 0a 20 20 73 71 6c 69 74 65  il = n;.  sqlite
5480: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
5490: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  = 0;.  return TC
54a0: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
54b0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
54c0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 0a  ite_malloc_stat.
54d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
54e0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72   number of prior
54f0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
5500: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 73 71 6c  Malloc() and sql
5510: 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 23 69  iteFree()..*/.#i
5520: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5530: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  G.static int sql
5540: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 28  ite_malloc_stat(
5550: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
5560: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
5570: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
5580: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
5590: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
55a0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
55b0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
55c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
55d0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
55e0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
55f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
5600: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5610: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
5620: 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 73 70   zBuf[200];.  sp
5630: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 20  rintf(zBuf, "%d 
5640: 25 64 20 25 64 22 2c 20 73 71 6c 69 74 65 33 5f  %d %d", sqlite3_
5650: 6e 4d 61 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33  nMalloc, sqlite3
5660: 5f 6e 46 72 65 65 2c 20 73 71 6c 69 74 65 33 5f  _nFree, sqlite3_
5670: 69 4d 61 6c 6c 6f 63 46 61 69 6c 29 3b 0a 20 20  iMallocFail);.  
5680: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5690: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
56a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
56b0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
56c0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
56d0: 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53  te_abort.**.** S
56e0: 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f 63  hutdown the proc
56f0: 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ess immediately.
5700: 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20    This is not a 
5710: 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a  clean shutdown..
5720: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
5730: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
5740: 74 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c 69  the recoverabili
5750: 74 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ty of a database
5760: 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74   in.** the event
5770: 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63 72   of a program cr
5780: 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ash..*/.static i
5790: 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 28  nt sqlite_abort(
57a0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
57b0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
57c0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
57d0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
57e0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
57f0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
5800: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
5810: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5820: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
5830: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
5840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
5850: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5860: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ent */.){.  asse
5870: 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b  rt( interp==0 );
5880: 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20     /* This will 
5890: 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20  always fail */. 
58a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
58b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
58c0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  lowing routine i
58d0: 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64  s a user-defined
58e0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68   SQL function wh
58f0: 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69  ose purpose.** i
5900: 73 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71  s to test the sq
5910: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28  lite_set_result(
5920: 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  ) API..*/.static
5930: 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73   void testFunc(s
5940: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5950: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
5960: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
5970: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c   **argv){.  whil
5980: 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  e( argc>=2 ){.  
5990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
59a0: 72 67 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  rg0 = sqlite3_va
59b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
59c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30  );.    if( zArg0
59d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   ){.      if( 0=
59e0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
59f0: 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b  zArg0, "int") ){
5a00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5a10: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
5a20: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
5a30: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29  ue_int(argv[1]))
5a40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5a50: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5a60: 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d  (zArg0,"int64")=
5a70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5a80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5a90: 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  64(context, sqli
5aa0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
5ab0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
5ac0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
5ad0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
5ae0: 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a  "string")==0 ){.
5af0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5b00: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
5b10: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
5b20: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
5b30: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
5b40: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
5b50: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
5b60: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5b70: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
5b80: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
5b90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5ba0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
5bb0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
5bc0: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
5bd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5be0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5bf0: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
5c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5c10: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
5c20: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
5c30: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
5c40: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
5c50: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
5c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5c70: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
5c80: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
5c90: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
5ca0: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
5cb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
5cc0: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
5cd0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5ce0: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
5cf0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
5d00: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
5d10: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
5d20: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
5d30: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
5d40: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5d50: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
5d60: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
5d70: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
5d80: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
5d90: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
5da0: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
5db0: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
5dc0: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
5dd0: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
5de0: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
5df0: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
5e00: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
5e10: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
5e20: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
5e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
5e40: 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a  _register_func(.
5e50: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
5e60: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
5e70: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
5e80: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
5e90: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
5ea0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
5eb0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
5ec0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5ed0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
5ee0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
5ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
5f00: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
5f10: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
5f20: 65 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  e *db;.  int rc;
5f30: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
5f40: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
5f50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
5f60: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
5f70: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
5f80: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
5f90: 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45  DB FUNCTION-NAME
5fa0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
5fb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
5fc0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
5fd0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
5fe0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
5ff0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6000: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
6010: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
6020: 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51   argv[2], -1, SQ
6030: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20  LITE_UTF8, 0, . 
6040: 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30       testFunc, 0
6050: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
6060: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
6070: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6080: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
6090: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
60a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
60b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
60c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
60d0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  ge:  sqlite3_fin
60e0: 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a  alize  STMT .**.
60f0: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74  ** Finalize a st
6100: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
6110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
6120: 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76  st_finalize(.  v
6130: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
6140: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
6150: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
6160: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
6170: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
6180: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
6190: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
61a0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
61b0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
61c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
61d0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
61e0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
61f0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
6200: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
6210: 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
6220: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
6230: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
6240: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
6250: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
6260: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
6270: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
6280: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6290: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
62a0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
62b0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
62c0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
62d0: 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29   *)errorName(rc)
62e0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
62f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
6300: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
6310: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20   sqlite3_reset  
6320: 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  STMT .**.** Fina
6330: 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74  lize a statement
6340: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
6350: 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73 65  ic int test_rese
6360: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
6370: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
6380: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
6390: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
63a0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
63b0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
63c0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
63d0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
63e0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
63f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6400: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
6410: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
6420: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
6430: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6440: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
6450: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
6460: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6470: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
6480: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
6490: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
64a0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
64b0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
64c0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
64d0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
64e0: 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tmt);.  if( rc )
64f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
6500: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
6510: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
6520: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
6530: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42  lite3_changes DB
6540: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
6550: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
6560: 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
6570: 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20  database by the 
6580: 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63  last SQL.** exec
6590: 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
65a0: 20 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65   int test_change
65b0: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
65c0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
65d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
65e0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
65f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
6600: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
6610: 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  db;.  if( objc!=
6620: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
6630: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6640: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
6650: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
6660: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
6670: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
6680: 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
6690: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
66a0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
66b0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
66c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
66d0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
66e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
66f0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
6700: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
6710: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
6720: 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a  _changes(db)));.
6730: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
6740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
6750: 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69  s the "static_bi
6760: 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76  nd_value" that v
6770: 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75  ariables are bou
6780: 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68  nd to when.** th
6790: 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66  e FLAG option of
67a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73   sqlite3_bind is
67b0: 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61   "static".*/.sta
67c0: 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
67d0: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
67e0: 75 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55  ue = 0;../*.** U
67f0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62  sage:  sqlite3_b
6800: 69 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41  ind  VM  IDX  VA
6810: 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a  LUE  FLAGS.**.**
6820: 20 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   Sets the value 
6830: 6f 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63  of the IDX-th oc
6840: 63 75 72 61 6e 63 65 20 6f 66 20 22 3f 22 20 69  curance of "?" i
6850: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
6860: 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
6870: 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
6880: 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
6890: 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
68a0: 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
68b0: 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
68c0: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
68d0: 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
68e0: 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
68f0: 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
6900: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
6910: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
6920: 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
6930: 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
6940: 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
6950: 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
6960: 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
6970: 4c 55 45 20 69 73 20 6d 61 64 65 2e 0a 2a 2f 0a  LUE is made..*/.
6980: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
6990: 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  bind(.  void *No
69a0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
69b0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
69c0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
69d0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
69e0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
69f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
6a20: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
6a30: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
6a40: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
6a50: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
6a60: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
6a70: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
6a80: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28    int idx;.  if(
6a90: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
6aa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6ab0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6ac0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
6ad0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
6ae0: 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44 58  .       " VM IDX
6af0: 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61   VALUE (null|sta
6b00: 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20  tic|normal)\"", 
6b10: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6b20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6b30: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
6b40: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
6b50: 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  1], &pStmt) ) re
6b60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6b70: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
6b80: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
6b90: 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
6ba0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
6bb0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
6bc0: 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"null")==0 ){. 
6bd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6be0: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
6bf0: 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69   idx);.  }else i
6c00: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
6c10: 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29  ],"static")==0 )
6c20: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6c30: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
6c40: 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f  mt, idx, sqlite_
6c50: 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
6c60: 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c  e, -1, 0);.  }el
6c70: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
6c80: 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d  gv[4],"normal")=
6c90: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
6ca0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
6cb0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67  (pStmt, idx, arg
6cc0: 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[3], -1, SQLITE
6cd0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
6ce0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
6cf0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6d00: 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e 74  p, "4th argument
6d10: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
6d20: 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f       "\"null\" o
6d30: 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72 20  r \"static\" or 
6d40: 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b  \"normal\"", 0);
6d50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6d60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
6d70: 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20   rc ){.    char 
6d80: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70  zBuf[50];.    sp
6d90: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
6da0: 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
6db0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6dc0: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
6dd0: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
6de0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6df0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6e00: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
6e10: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
6e20: 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
6e30: 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e   <db ptr> <utf8>
6e40: 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
6e50: 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  6be>.**.** This 
6e60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
6e70: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
6e80: 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65  Lite selects the
6e90: 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69   correct collati
6ea0: 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63  on.** sequence c
6eb0: 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c  allback when mul
6ec0: 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28  tiple versions (
6ed0: 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65  for different te
6ee0: 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a  xt encodings).**
6ef0: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a   are available..
6f00: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
6f10: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
6f20: 74 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  ters the collati
6f30: 6f 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73  on sequence "tes
6f40: 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69  t_collate".** wi
6f50: 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
6f60: 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63  le <db>. The sec
6f70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  ond argument mus
6f80: 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74  t be a list of t
6f90: 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20  hree.** boolean 
6fa0: 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66  values. If the f
6fb0: 69 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68  irst is true, th
6fc0: 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  en a version of 
6fd0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a  test_collate is.
6fe0: 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  ** registered fo
6ff0: 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20  r UTF-8, if the 
7000: 73 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20  second is true, 
7010: 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67  a version is reg
7020: 69 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55  istered for.** U
7030: 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20  TF-16le, if the 
7040: 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
7050: 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
7060: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  n is available..
7070: 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  ** Previous vers
7080: 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c  ions of test_col
7090: 6c 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64  late are deleted
70a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
70b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
70c0: 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69  est_collate is i
70d0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
70e0: 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c  lling the.** fol
70f0: 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70  lowing TCL scrip
7100: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74  t:.**.**   "test
7110: 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c  _collate <enc> <
7120: 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a  lhs> <rhs>".**.*
7130: 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20  * The <lhs> and 
7140: 3c 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77  <rhs> are the tw
7150: 6f 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63  o values being c
7160: 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64  ompared, encoded
7170: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68   in UTF-8..** Th
7180: 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65  e <enc> paramete
7190: 72 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  r is the encodin
71a0: 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  g of the collati
71b0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  on function that
71c0: 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63  .** SQLite selec
71d0: 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65  ted to call. The
71e0: 20 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74   TCL test script
71f0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a   implements the.
7200: 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  ** "test_collate
7210: 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  " proc..**.** No
7220: 74 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c  te that this wil
7230: 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68  l only work with
7240: 20 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20   one intepreter 
7250: 61 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68  at a time, as th
7260: 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e  e.** interp poin
7270: 74 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ter to use when 
7280: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54  evaluating the T
7290: 43 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f  CL script is sto
72a0: 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43  red in.** pTestC
72b0: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f  ollateInterp..*/
72c0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65  .static Tcl_Inte
72d0: 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  rp* pTestCollate
72e0: 49 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69  Interp;.static i
72f0: 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  nt test_collate_
7300: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43  func(.  void *pC
7310: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63  tx, .  int nA, c
7320: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
7330: 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76   int nB, const v
7340: 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c  oid *zB.){.  Tcl
7350: 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65  _Interp *i = pTe
7360: 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
7370: 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 28  .  int encin = (
7380: 69 6e 74 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  int)pCtx;.  int 
7390: 72 65 73 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  res;..  sqlite3_
73a0: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54  value *pVal;.  T
73b0: 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70  cl_Obj *pX;..  p
73c0: 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
73d0: 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61  gObj("test_colla
73e0: 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  te", -1);.  Tcl_
73f0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
7400: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63  ;..  switch( enc
7410: 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  in ){.    case S
7420: 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20  QLITE_UTF8:.    
7430: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
7440: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
7450: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7460: 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20  ("UTF-8",-1));. 
7470: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7480: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
7490: 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  6LE:.      Tcl_L
74a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
74b0: 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
74c0: 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
74d0: 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  6LE",-1));.     
74e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
74f0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a   SQLITE_UTF16BE:
7500: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
7510: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7520: 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
7530: 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22  ngObj("UTF-16BE"
7540: 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
7550: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
7560: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
7570: 3b 0a 20 20 7d 0a 0a 20 20 70 56 61 6c 20 3d 20  ;.  }..  pVal = 
7580: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
7590: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
75a0: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41  eSetStr(pVal, nA
75b0: 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zA, encin, SQL
75c0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 54  ITE_STATIC);.  T
75d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
75e0: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
75f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
7600: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7610: 28 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20 20 73  (pVal),-1));.  s
7620: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
7630: 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20  r(pVal, nB, zB, 
7640: 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
7650: 41 54 49 43 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ATIC);.  Tcl_Lis
7660: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
7670: 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
7680: 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
7690: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
76a0: 2c 2d 31 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,-1));.  sqlite3
76b0: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
76c0: 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ..  Tcl_EvalObjE
76d0: 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  x(i, pX, 0);.  T
76e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
76f0: 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e  pX);.  Tcl_GetIn
7700: 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f  tFromObj(i, Tcl_
7710: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c  GetObjResult(i),
7720: 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e   &res);.  return
7730: 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69   res;.}.static i
7740: 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28  nt test_collate(
7750: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
7760: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
7770: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
7780: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
7790: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
77a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
77b0: 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73  ;.  int val;.  s
77c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
77d0: 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
77e0: 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =5 ) goto bad_ar
77f0: 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61  gs;.  pTestColla
7800: 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  teInterp = inter
7810: 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  p;.  if( getDbPo
7820: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
7830: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
7840: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
7850: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
7860: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
7870: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
7880: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
7890: 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
78a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
78b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
78c0: 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74  collation(db, "t
78d0: 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
78e0: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
78f0: 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
7900: 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73  TE_UTF8, val?tes
7910: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
7920: 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  );.  if( TCL_OK!
7930: 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
7940: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
7950: 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
7960: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7970: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
7980: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
7990: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
79a0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
79b0: 20 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64 20   .        (void 
79c0: 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  *)SQLITE_UTF16LE
79d0: 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
79e0: 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66  te_func:0);.  if
79f0: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
7a00: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
7a10: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
7a20: 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
7a30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 56  TCL_ERROR;..  pV
7a40: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
7a50: 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65  eNew();.  sqlite
7a60: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
7a70: 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c  l, -1, "test_col
7a80: 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
7a90: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
7aa0: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72  C);.  sqlite3_cr
7ab0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
7ac0: 28 64 62 2c 20 73 71 6c 69 74 65 33 56 61 6c 75  (db, sqlite3Valu
7ad0: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
7ae0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 2c  TE_UTF16NATIVE),
7af0: 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45   .        SQLITE
7b00: 5f 55 54 46 31 36 42 45 2c 20 28 76 6f 69 64 20  _UTF16BE, (void 
7b10: 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  *)SQLITE_UTF16BE
7b20: 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
7b30: 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 73 71  te_func:0);.  sq
7b40: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
7b50: 56 61 6c 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  Val);.  .  retur
7b60: 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61  n TCL_OK;..bad_a
7b70: 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rgs:.  Tcl_Appen
7b80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7b90: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7ba0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
7bb0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
7bc0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
7bd0: 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74  , 0), " <DB> <ut
7be0: 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
7bf0: 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20  tf16be>", 0);.  
7c00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7c10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
7c20: 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
7c30: 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20  eded_cb(.  void 
7c40: 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65  *pCtx, .  sqlite
7c50: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65  3 *db,.  int eTe
7c60: 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76  xtRep,.  const v
7c70: 6f 69 64 20 2a 6e 6f 74 55 73 65 64 0a 29 7b 0a  oid *notUsed.){.
7c80: 20 20 69 6e 74 20 65 6e 63 20 3d 20 64 62 2d 3e    int enc = db->
7c90: 65 6e 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  enc;.  sqlite3_c
7ca0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
7cb0: 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65 73 74  .      db, "test
7cc0: 5f 63 6f 6c 6c 61 74 65 22 2c 20 64 62 2d 3e 65  _collate", db->e
7cd0: 6e 63 2c 20 28 76 6f 69 64 20 2a 29 65 6e 63 2c  nc, (void *)enc,
7ce0: 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
7cf0: 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  nc);.}../*.** Us
7d00: 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
7d10: 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a  llate_needed DB.
7d20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
7d30: 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
7d40: 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
7d50: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
7d60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
7d70: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
7d80: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
7d90: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
7da0: 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  db;..  if( objc!
7db0: 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =2 ) goto bad_ar
7dc0: 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  gs;.  if( getDbP
7dd0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
7de0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
7df0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
7e00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7e10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74    sqlite3_collat
7e20: 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c  ion_needed16(db,
7e30: 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   0, test_collate
7e40: 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 72  _needed_cb);.  r
7e50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
7e60: 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57  ad_args:.  Tcl_W
7e70: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
7e80: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
7e90: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ");.  return TCL
7ea0: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
7eb0: 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
7ec0: 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74  _function <db pt
7ed0: 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
7ee0: 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
7ef0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7f00: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
7f10: 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
7f20: 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
7f30: 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69  t user.** functi
7f40: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  on callback when
7f50: 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
7f60: 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
7f70: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
7f80: 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
7f90: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
7fa0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
7fb0: 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74  egisters up to t
7fc0: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
7fd0: 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
7fe0: 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63  on.** "test_func
7ff0: 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62  tion" with datab
8000: 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
8010: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
8020: 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74  argument is.** t
8030: 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73  rue, then a vers
8040: 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63  ion of test_func
8050: 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  tion is register
8060: 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
8070: 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73   the.** third is
8080: 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e   true, a version
8090: 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66   is registered f
80a0: 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  or UTF-16le, if 
80b0: 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a  the fourth is.**
80c0: 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
80d0: 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
80e0: 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75  ilable.  Previou
80f0: 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a  s versions of.**
8100: 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61   test_function a
8110: 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
8120: 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74  * The user funct
8130: 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
8140: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
8150: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  e following TCL 
8160: 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
8170: 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c  "test_function <
8180: 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a  enc> <arg>".**.*
8190: 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73  * Where <enc> is
81a0: 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55   one of UTF-8, U
81b0: 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36  TF-16LE or UTF16
81c0: 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73  BE, and <arg> is
81d0: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61   the.** single a
81e0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
81f0: 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  o the SQL functi
8200: 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
8210: 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65  turned by.** the
8220: 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75   TCL script is u
8230: 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72  sed as the retur
8240: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53  n value of the S
8250: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a  QL function. It.
8260: 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ** is passed to 
8270: 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46  SQLite using UTF
8280: 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d  -16BE for a UTF-
8290: 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  8 test_function(
82a0: 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20  ), UTF-8.** for 
82b0: 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f  a UTF-16LE test_
82c0: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20  function(), and 
82d0: 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20  UTF-16LE for an 
82e0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
82f0: 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55  hat.** prefers U
8300: 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 73 74 61 74  TF-16BE..*/.stat
8310: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
8320: 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71  ction_utf8(.  sq
8330: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
8340: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
8350: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
8360: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
8370: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8380: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
8390: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
83a0: 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
83b0: 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
83c0: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
83d0: 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
83e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
83f0: 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
8400: 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
8410: 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
8420: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8430: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8440: 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
8450: 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
8460: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
8470: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8480: 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
8490: 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
84a0: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ngObj(sqlite3_va
84b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
84c0: 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
84d0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
84e0: 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
84f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
8500: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
8510: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c  t_text(pCtx, Tcl
8520: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
8530: 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51  (interp), -1, SQ
8540: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
8550: 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
8560: 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73  3ValueNew();.  s
8570: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
8580: 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
8590: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
85a0: 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
85b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
85c0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
85d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
85e0: 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c  xt16be(pCtx, sql
85f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
8600: 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6be(pVal),.     
8610: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
8620: 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
8630: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
8640: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
8650: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
8660: 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  f16le(.  sqlite3
8670: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
8680: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
8690: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
86a0: 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
86b0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
86c0: 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
86d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
86e0: 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
86f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
8700: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
8710: 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
8720: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
8730: 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
8740: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
8750: 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
8760: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8770: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
8780: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8790: 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d  bj("UTF-16LE", -
87a0: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
87b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
87c0: 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
87d0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
87e0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
87f0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
8800: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
8810: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
8820: 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
8830: 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
8840: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
8850: 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c  alueNew();.  sql
8860: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
8870: 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
8880: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
8890: 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
88a0: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
88b0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
88c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
88d0: 28 70 43 74 78 2c 73 71 6c 69 74 65 33 5f 76 61  (pCtx,sqlite3_va
88e0: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d  lue_text(pVal),-
88f0: 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  1,SQLITE_TRANSIE
8900: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  NT);.  sqlite3Va
8910: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d  lueFree(pVal);.}
8920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
8930: 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
8940: 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  be(.  sqlite3_co
8950: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
8960: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
8970: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8980: 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
8990: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
89a0: 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
89b0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
89c0: 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
89d0: 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
89e0: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
89f0: 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
8a00: 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
8a10: 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
8a20: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
8a30: 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
8a40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
8a50: 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
8a60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8a70: 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29  "UTF-16BE", -1))
8a80: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
8a90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8aa0: 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
8ab0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8ac0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
8ad0: 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
8ae0: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
8af0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
8b00: 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
8b10: 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56  fCount(pX);.  pV
8b20: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
8b30: 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65  eNew();.  sqlite
8b40: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
8b50: 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
8b60: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
8b70: 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
8b80: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
8b90: 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
8ba0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c  3_result_text16l
8bb0: 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
8bc0: 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
8bd0: 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
8be0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
8c00: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73  eFree(pVal);.}.s
8c10: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66  tatic int test_f
8c20: 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
8c30: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
8c40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8c50: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
8c60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
8c70: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
8c80: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
8c90: 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  val;..  if( objc
8ca0: 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=5 ) goto bad_a
8cb0: 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62  rgs;.  if( getDb
8cc0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
8cd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
8ce0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
8cf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8d00: 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
8d10: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
8d20: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8d30: 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
8d40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8d50: 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
8d60: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
8d70: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
8d80: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
8d90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
8da0: 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
8db0: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
8dc0: 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  f8, 0, 0);.  }. 
8dd0: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
8de0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
8df0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
8e00: 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  3], &val) ) retu
8e10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8e20: 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
8e30: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8e40: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
8e50: 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
8e60: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a  QLITE_UTF16LE, .
8e70: 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
8e80: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
8e90: 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  f16le, 0, 0);.  
8ea0: 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  }.  if( TCL_OK!=
8eb0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
8ec0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8ed0: 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[4], &val) ) r
8ee0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8ef0: 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
8f00: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
8f10: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
8f20: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
8f30: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
8f40: 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
8f50: 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
8f60: 5f 75 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b  _utf16be, 0, 0);
8f70: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
8f80: 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a  CL_OK;.bad_args:
8f90: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
8fa0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8fb0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8fc0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
8fd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8fe0: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
8ff0: 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20  , " <DB> <utf8> 
9000: 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
9010: 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75  be>", 0);.  retu
9020: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
9030: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
9040: 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74        test_errst
9050: 72 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a  r <err code>.**.
9060: 2a 2a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  ** Test that the
9070: 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   english languag
9080: 65 20 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c  e string equival
9090: 65 6e 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20  ents for sqlite 
90a0: 65 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61  error codes.** a
90b0: 72 65 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72  re sane. The par
90c0: 61 6d 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74  ameter is an int
90d0: 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e  eger representin
90e0: 67 20 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f  g an sqlite erro
90f0: 72 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72  r code..** The r
9100: 65 73 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20  esult is a list 
9110: 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c  of two elements,
9120: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
9130: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9140: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
9150: 61 6e 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20  and the english 
9160: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
9170: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9180: 69 6e 74 20 74 65 73 74 5f 65 72 72 73 74 72 28  int test_errstr(
9190: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
91a0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
91b0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
91c0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
91d0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
91e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65  ){.  char *zCode
91f0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
9200: 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
9210: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
9220: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
9230: 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22  , "<error code>"
9240: 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20  );.  }..  zCode 
9250: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
9260: 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28  objv[1]);.  for(
9270: 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29  i=0; i<200; i++)
9280: 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72  {.    if( 0==str
9290: 63 6d 70 28 65 72 72 6f 72 4e 61 6d 65 28 69 29  cmp(errorName(i)
92a0: 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b  , zCode) ) break
92b0: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
92c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
92d0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
92e0: 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65  Str(i), 0);.  re
92f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9300: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9310: 65 33 5f 63 72 61 73 68 70 61 72 61 6d 73 28 0a  e3_crashparams(.
9320: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
9330: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
9340: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
9350: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
9360: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
9370: 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54  {.#ifdef OS_TEST
9380: 0a 20 20 69 6e 74 20 64 65 6c 61 79 3b 0a 20 20  .  int delay;.  
9390: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 20 67 6f  if( objc!=3 ) go
93a0: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
93b0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
93c0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
93d0: 76 5b 31 5d 2c 20 26 64 65 6c 61 79 29 20 29 20  v[1], &delay) ) 
93e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
93f0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 43 72  ;.  sqlite3SetCr
9400: 61 73 68 50 61 72 61 6d 73 28 64 65 6c 61 79 2c  ashParams(delay,
9410: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9420: 62 6a 76 5b 32 5d 29 29 3b 0a 23 65 6e 64 69 66  bjv[2]));.#endif
9430: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9440: 3b 0a 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53  ;..#ifdef OS_TES
9450: 54 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63  T.bad_args:.  Tc
9460: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9470: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
9480: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
9490: 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47  \"",.      Tcl_G
94a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
94b0: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 3c 64  objv[0], 0), "<d
94c0: 65 6c 61 79 3e 20 3c 66 69 6c 65 6e 61 6d 65 3e  elay> <filename>
94d0: 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 0);.  return 
94e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69  TCL_ERROR;.#endi
94f0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  f.}.../*.** Usag
9500: 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74  e:    breakpoint
9510: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9520: 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f  ine exists for o
9530: 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20  ne purpose - to 
9540: 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20  provide a place 
9550: 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61  to put a.** brea
9560: 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20  kpoint with GDB 
9570: 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69 67  that can be trig
9580: 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20  gered using TCL 
9590: 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a  code.  The use.*
95a0: 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77 68  * for this is wh
95b0: 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  en a particular 
95c0: 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73  test fails on (s
95d0: 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20 69  ay) the 1485th i
95e0: 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20  teration..** In 
95f0: 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72  the TCL test scr
9600: 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20  ipt, we can add 
9610: 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
9620: 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69  **.**     if {$i
9630: 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69  ==1485} breakpoi
9640: 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75  nt.**.** Then ru
9650: 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69 6e  n testfixture in
9660: 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61 6e   the debugger an
9670: 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 62  d wait for the b
9680: 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20  reakpoint to.** 
9690: 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69  fire.  Then addi
96a0: 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e  tional breakpoin
96b0: 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f  ts can be set to
96c0: 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20   trace down the 
96d0: 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
96e0: 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  nt test_breakpoi
96f0: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
9700: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9710: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9720: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9730: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9740: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9750: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9770: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9780: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9790: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
97a0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
97b0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72  gument */.){.  r
97c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20  eturn TCL_OK;   
97d0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
97e0: 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
97f0: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
9800: 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20  _bind_int  STMT 
9810: 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
9820: 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
9830: 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66 61 63  ind_int interfac
9840: 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
9850: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9860: 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
9870: 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
9880: 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
9890: 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
98a0: 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
98b0: 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74  nds a 32-bit int
98c0: 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
98d0: 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
98e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
98f0: 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64  bind_int(.  void
9900: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
9910: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
9920: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
9930: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
9940: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
9950: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
9960: 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
9970: 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  int value;.  int
9980: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
9990: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
99a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
99b0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
99c0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
99d0: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
99e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
99f0: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
9a00: 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
9a10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9a20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
9a30: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
9a40: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9a50: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
9a60: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
9a70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
9a80: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
9a90: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
9aa0: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
9ab0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9ac0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9ad0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
9ae0: 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
9af0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9b00: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
9b10: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
9b20: 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
9b30: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9b40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
9b50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9b60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
9b70: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
9b80: 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
9b90: 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54  bind_int64  STMT
9ba0: 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
9bb0: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
9bc0: 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72  bind_int64 inter
9bd0: 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
9be0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9bf0: 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
9c00: 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
9c10: 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
9c20: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
9c30: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
9c40: 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
9c50: 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
9c60: 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
9c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
9c80: 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20  st_bind_int64(. 
9c90: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
9ca0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
9cb0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
9cc0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
9cd0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
9ce0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9cf0: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
9d00: 78 3b 0a 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  x;.  i64 value;.
9d10: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
9d20: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
9d30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9d40: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9d50: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9d60: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
9d70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9d80: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
9d90: 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22   " STMT N VALUE"
9da0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9db0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9dc0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
9dd0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
9de0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
9df0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
9e00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9e10: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
9e20: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
9e30: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
9e40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9e50: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
9e60: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
9e70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
9e80: 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75  , &value) ) retu
9e90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
9ea0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
9eb0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
9ec0: 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
9ed0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9ee0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
9ef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
9f00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9f10: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
9f20: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9f30: 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56  double  STMT N V
9f40: 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
9f50: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
9f60: 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63  _double interfac
9f70: 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
9f80: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9f90: 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
9fa0: 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
9fb0: 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
9fc0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
9fd0: 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
9fe0: 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
9ff0: 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
a000: 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
a010: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
a020: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76  bind_double(.  v
a030: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
a040: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
a050: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
a060: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
a070: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
a080: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a090: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
a0a0: 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b  .  double value;
a0b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
a0c0: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
a0d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a0e0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
a0f0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
a100: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
a110: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a120: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
a130: 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
a140: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
a150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a160: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
a170: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
a180: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
a190: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
a1a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a1b0: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
a1c0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
a1d0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
a1e0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a1f0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
a200: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
a210: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
a220: 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75  , &value) ) retu
a230: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
a240: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
a250: 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  nd_double(pStmt,
a260: 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20   idx, value);.  
a270: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a280: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
a290: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
a2a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
a2b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
a2c0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a2d0: 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a  null  STMT N.**.
a2e0: 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
a2f0: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e  te3_bind_null in
a300: 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
a310: 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
a320: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
a330: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
a340: 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
a350: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a360: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
a370: 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c  .** binds a NULL
a380: 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
a390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a3a0: 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a  test_bind_null(.
a3b0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
a3c0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
a3d0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
a3e0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
a3f0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
a400: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
a410: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
a420: 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  dx;.  int rc;.. 
a430: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
a440: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a450: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
a460: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
a470: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
a480: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
a490: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
a4a0: 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20   0), " STMT N", 
a4b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a4c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
a4d0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
a4e0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
a4f0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
a500: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
a510: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a520: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
a530: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a540: 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
a550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a560: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
a570: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
a580: 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  mt, idx);.  if( 
a590: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a5a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a5b0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
a5c0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a5d0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
a5e0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
a5f0: 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20    STMT N STRING 
a600: 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
a610: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
a620: 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65  d_text interface
a630: 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
a640: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
a650: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
a660: 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
a670: 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
a680: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
a690: 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
a6a0: 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  ds a UTF-8 strin
a6b0: 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
a6c0: 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
a6d0: 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
a6e0: 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
a6f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
a700: 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f  _bind_text(.  vo
a710: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
a720: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a730: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
a740: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
a750: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
a760: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
a770: 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
a780: 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
a790: 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
a7a0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
a7b0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
a7c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a7d0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
a7e0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a7f0: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
a800: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a810: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
a820: 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
a830: 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
a840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a850: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
a860: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
a870: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
a880: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
a890: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
a8a0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
a8b0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
a8c0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
a8d0: 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
a8e0: 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
a8f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
a900: 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[3]);.  if( T
a910: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a920: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
a930: 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
a940: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
a950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
a960: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
a970: 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73  dx, value, bytes
a980: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a990: 4e 54 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  NT);.  if( rc!=S
a9a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a9b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a9c0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
a9d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a9e0: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
a9f0: 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 53  3_bind_text16  S
aa00: 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
aa10: 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
aa20: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
aa30: 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e  ext16 interface.
aa40: 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
aa50: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
aa60: 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
aa70: 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
aa80: 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
aa90: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
aaa0: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
aab0: 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e  s a UTF-16 strin
aac0: 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
aad0: 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
aae0: 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
aaf0: 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
ab00: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
ab10: 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20  _bind_text16(.  
ab20: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
ab30: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
ab40: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
ab50: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
ab60: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
ab70: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
ab80: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
ab90: 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
aba0: 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
abb0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
abc0: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
abd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
abe0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
abf0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
ac00: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
ac10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ac20: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
ac30: 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59   STMT N VALUE BY
ac40: 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
ac50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ac60: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
ac70: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
ac80: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
ac90: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
aca0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
acb0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
acc0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
acd0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
ace0: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
acf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
ad00: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
ad10: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
ad20: 33 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63  3], 0);.  if( Tc
ad30: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
ad40: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
ad50: 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
ad60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
ad70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
ad80: 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c 20  d_text16(pStmt, 
ad90: 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c  idx, (void *)val
ada0: 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54  ue, bytes, SQLIT
adb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
adc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
add0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
ade0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
adf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ae00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
ae10: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ae20: 62 6c 6f 62 20 20 53 54 4d 54 20 4e 20 44 41 54  blob  STMT N DAT
ae30: 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  A BYTES.**.** Te
ae40: 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
ae50: 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61  ind_blob interfa
ae60: 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
ae70: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ae80: 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
ae90: 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
aea0: 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
aeb0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
aec0: 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
aed0: 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74  inds a BLOB to t
aee0: 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
aef0: 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20  e BLOB is BYTES 
af00: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
af10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
af20: 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76  t_bind_blob(.  v
af30: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
af40: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
af50: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
af60: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
af70: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
af80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
af90: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
afa0: 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
afb0: 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
afc0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
afd0: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
afe0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
aff0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
b000: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
b010: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
b020: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
b030: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
b040: 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
b050: 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
b060: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b070: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
b080: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b090: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b0a0: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
b0b0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b0c0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
b0d0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
b0e0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
b0f0: 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
b100: 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
b110: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b120: 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[3]);.  if( T
b130: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
b140: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
b150: 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
b160: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
b170: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
b180: 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  nd_blob(pStmt, i
b190: 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73  dx, value, bytes
b1a0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
b1b0: 4e 54 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  NT);.  if( rc!=S
b1c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b1d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b1e0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b1f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
b200: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
b210: 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a  errcode DB.**.**
b220: 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
b230: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
b240: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
b250: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
b260: 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  PI.** error code
b270: 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45  . e.g. "SQLITE_E
b280: 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  RROR"..*/.static
b290: 20 69 6e 74 20 74 65 73 74 5f 65 72 72 63 6f 64   int test_errcod
b2a0: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
b2b0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
b2c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
b2d0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
b2e0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b2f0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
b300: 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  db;..  if( objc!
b310: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
b320: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b330: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
b340: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
b350: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
b360: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
b370: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
b380: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b390: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
b3a0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
b3b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b3c0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
b3d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b3e0: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
b3f0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
b400: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 73 71 6c 69  *)errorName(sqli
b410: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 29  te3_errcode(db))
b420: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
b430: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b440: 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72  Usage:   test_er
b450: 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  rmsg DB.**.** Re
b460: 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38 20  turns the UTF-8 
b470: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
b480: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
b490: 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
b4a0: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
b4b0: 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
b4c0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
b4d0: 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 28  int test_errmsg(
b4e0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
b4f0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
b500: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
b510: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
b520: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
b530: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
b540: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b550: 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Err;..  if( objc
b560: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
b570: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b580: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
b590: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
b5a0: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
b5b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
b5c0: 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
b5d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b5e0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
b5f0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
b600: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
b610: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
b620: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b630: 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  R;..  zErr = sql
b640: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b  ite3_errmsg(db);
b650: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
b660: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b670: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72  NewStringObj(zEr
b680: 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72  r, -1));.  retur
b690: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
b6a0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74  ** Usage:   test
b6b0: 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a 0a  _errmsg16 DB.**.
b6c0: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55  ** Returns the U
b6d0: 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74 61  TF-16 representa
b6e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f  tion of the erro
b6f0: 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
b700: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74   for the.** most
b710: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
b720: 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69 73  * API call. This
b730: 20 69 73 20 61 20 62 79 74 65 20 61 72 72 61 79   is a byte array
b740: 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 54   object at the T
b750: 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e  CL .** level, an
b760: 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74 68  d it includes th
b770: 65 20 30 78 30 30 20 30 78 30 30 20 74 65 72 6d  e 0x00 0x00 term
b780: 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74 20  inator bytes at 
b790: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
b7a0: 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 2e  * UTF-16 string.
b7b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b7c0: 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a 20 20  est_errmsg16(.  
b7d0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
b7e0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
b7f0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
b800: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
b810: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
b820: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
b830: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72  const void *zErr
b840: 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 0a  ;.  int bytes;..
b850: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
b860: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b870: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
b880: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
b890: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
b8a0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
b8b0: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
b8c0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
b8d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
b8e0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
b8f0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
b900: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
b910: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
b920: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
b930: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
b940: 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 62  rrmsg16(db);.  b
b950: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 75 74  ytes = sqlite3ut
b960: 66 31 36 42 79 74 65 4c 65 6e 28 7a 45 72 72 2c  f16ByteLen(zErr,
b970: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   -1);.  Tcl_SetO
b980: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
b990: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
b9a0: 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73  yObj(zErr, bytes
b9b0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
b9c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
b9d0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
b9e0: 70 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65  pare DB sql byte
b9f0: 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20  s tailvar.**.** 
ba00: 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
ba10: 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
ba20: 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
ba30: 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
ba40: 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
ba50: 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
ba60: 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
ba70: 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
ba80: 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
ba90: 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
baa0: 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
bab0: 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
bac0: 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
bad0: 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
bae0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
baf0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
bb00: 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20  epare(.  void * 
bb10: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
bb20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
bb30: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
bb40: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
bb50: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
bb60: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
bb70: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
bb80: 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
bb90: 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
bba0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
bbb0: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
bbc0: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
bbd0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bbe0: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
bbf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
bc00: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
bc10: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
bc20: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
bc30: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
bc40: 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
bc50: 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29  tes tailvar", 0)
bc60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bc70: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
bc80: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
bc90: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
bca0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
bcb0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
bcc0: 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
bcd0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
bce0: 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
bcf0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
bd00: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
bd10: 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
bd20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
bd30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
bd40: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
bd50: 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26  bytes, &pStmt, &
bd60: 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 7a 54  zTail);.  if( zT
bd70: 61 69 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 62  ail ){.    if( b
bd80: 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
bd90: 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
bda0: 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20   (zTail-zSql);. 
bdb0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
bdc0: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
bdd0: 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
bde0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
bdf0: 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
be00: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
be10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
be20: 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
be30: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
be40: 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
be50: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
be60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
be70: 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
be80: 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
be90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
bea0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
beb0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
bec0: 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  makePointerStr(i
bed0: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
bee0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
bef0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
bf00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bf10: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
bf20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
bf30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
bf40: 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
bf50: 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73  are DB sql bytes
bf60: 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
bf70: 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
bf80: 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
bf90: 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
bfa0: 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
bfb0: 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
bfc0: 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
bfd0: 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
bfe0: 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
bff0: 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
c000: 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
c010: 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
c020: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
c030: 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
c040: 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
c050: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
c060: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
c070: 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  pare16(.  void *
c080: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
c090: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c0a0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
c0b0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
c0c0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
c0d0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
c0e0: 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
c0f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
c100: 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
c110: 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
c120: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
c130: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
c140: 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 62 79  uf[50];.  int by
c150: 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
c160: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
c170: 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
c180: 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
c190: 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
c1a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
c1b0: 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
c1c0: 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
c1d0: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
c1e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c1f0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
c200: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
c210: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
c220: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
c230: 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
c240: 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
c250: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c260: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c270: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
c280: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
c290: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
c2a0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
c2b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
c2c0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
c2d0: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
c2e0: 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20  2], &objlen);.  
c2f0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
c300: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
c310: 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
c320: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c330: 52 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  R;..  if( SQLITE
c340: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65  _OK!=sqlite3_pre
c350: 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c  pare16(db, zSql,
c360: 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
c370: 26 7a 54 61 69 6c 29 20 29 7b 0a 20 20 20 20 72  &zTail) ){.    r
c380: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c390: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69  .  }..  if( zTai
c3a0: 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  l ){.    objlen 
c3b0: 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20  = objlen - ((u8 
c3c0: 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
c3d0: 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ql);.  }else{.  
c3e0: 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
c3f0: 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f  }.  pTail = Tcl_
c400: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
c410: 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a  (u8 *)zTail, obj
c420: 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  len);.  Tcl_Incr
c430: 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
c440: 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72  .  Tcl_ObjSetVar
c450: 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
c460: 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
c470: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
c480: 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69  unt(pTail);..  i
c490: 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
c4a0: 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53  if( makePointerS
c4b0: 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
c4c0: 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
c4d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c4e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c4f0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
c500: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
c510: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
c520: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70  sage: sqlite3_op
c530: 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74  en filename ?opt
c540: 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74  ions-list?.*/.st
c550: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70  atic int test_op
c560: 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  en(.  void * cli
c570: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
c580: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
c590: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
c5a0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
c5b0: 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
c5c0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
c5d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
c5e0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
c5f0: 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
c600: 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
c610: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
c620: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c630: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
c640: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
c650: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
c660: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
c670: 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
c680: 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
c690: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c6a0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
c6b0: 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
c6c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
c6d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
c6e0: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
c6f0: 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d  &db);.  .  if( m
c700: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
c710: 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
c720: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c730: 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
c740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
c750: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
c760: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
c770: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
c780: 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d  3_open16 filenam
c790: 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  e options.*/.sta
c7a0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
c7b0: 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  n16(.  void * cl
c7c0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
c7d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
c7e0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
c7f0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c800: 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76  v[].){.  const v
c810: 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid *zFilename;.
c820: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
c830: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
c840: 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
c850: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
c860: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c870: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
c880: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
c890: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
c8a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c8b0: 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
c8c0: 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22  me options-list"
c8d0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
c8e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c8f0: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
c900: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
c910: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
c920: 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
c930: 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e  e3_open16(zFilen
c940: 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
c950: 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53  if( makePointerS
c960: 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
c970: 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
c980: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
c990: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c9a0: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
c9b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
c9c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
c9d0: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31  qlite3_complete1
c9e0: 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67  6 <UTF-16 string
c9f0: 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  >.**.** Return 1
ca00: 20 69 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   if the supplied
ca10: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63   argument is a c
ca20: 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
ca30: 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a  ement, or zero.*
ca40: 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
ca50: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
ca60: 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f  complete16(.  vo
ca70: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
ca80: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
ca90: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
caa0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
cab0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
cac0: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69  char *zBuf;..  i
cad0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
cae0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
caf0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
cb00: 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c  jv, "<utf-16 sql
cb10: 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >");.    return 
cb20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
cb30: 20 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47 65 74    zBuf = Tcl_Get
cb40: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
cb50: 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
cb60: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
cb70: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
cb80: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
cb90: 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29  omplete16(zBuf))
cba0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
cbb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
cbc0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ge: sqlite3_step
cbd0: 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61   STMT.**.** Adva
cbe0: 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  nce the statemen
cbf0: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  t to the next ro
cc00: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
cc10: 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f   test_step(.  vo
cc20: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
cc30: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cc40: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
cc50: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
cc60: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
cc70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
cc80: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
cc90: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
cca0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
ccb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
ccc0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
ccd0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
cce0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
ccf0: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
cd00: 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
cd10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cd20: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
cd30: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
cd40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
cd50: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
cd60: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
cd70: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
cd80: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
cd90: 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53  ..  /* if( rc!=S
cda0: 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63  QLITE_DONE && rc
cdb0: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72  !=SQLITE_ROW ) r
cdc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cdd0: 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73   */.  Tcl_SetRes
cde0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
cdf0: 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63  r *)errorName(rc
ce00: 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
ce10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
ce20: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
ce30: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d  column_count STM
ce40: 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
ce50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
ce60: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
ce70: 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
ce80: 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
ce90: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
cea0: 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  umn_count(.  voi
ceb0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
cec0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
ced0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
cee0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
cef0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
cf00: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
cf10: 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
cf20: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
cf30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
cf40: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
cf50: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
cf60: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
cf70: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
cf80: 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
cf90: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
cfa0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
cfb0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
cfc0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
cfd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
cfe0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
cff0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d000: 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
d010: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
d020: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
d030: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
d040: 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
d050: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
d060: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
d070: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53  e3_column_type S
d080: 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
d090: 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
d0a0: 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20   of the data in 
d0b0: 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
d0c0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
d0d0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
d0e0: 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79  t test_column_ty
d0f0: 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pe(.  void * cli
d100: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d110: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d120: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d130: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d140: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
d150: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
d160: 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70  nt col;.  int tp
d170: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
d180: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
d190: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d1a0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
d1b0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
d1c0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
d1d0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
d1e0: 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
d1f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d200: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
d210: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
d220: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
d230: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
d240: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
d250: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d260: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
d270: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
d280: 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
d290: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d2a0: 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65  ;..  tp = sqlite
d2b0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
d2c0: 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69  tmt, col);.  swi
d2d0: 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63  tch( tp ){.    c
d2e0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
d2f0: 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53  ER: .      Tcl_S
d300: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
d310: 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f   "INTEGER", TCL_
d320: 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
d330: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
d340: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20  SQLITE_NULL:.   
d350: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
d360: 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c  (interp, "NULL",
d370: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
d380: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d390: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
d3a0: 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  T:.      Tcl_Set
d3b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d3c0: 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54  FLOAT", TCL_STAT
d3d0: 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
d3e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
d3f0: 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54  TE_TEXT:.      T
d400: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
d410: 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c  erp, "TEXT", TCL
d420: 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
d430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
d440: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20   SQLITE_BLOB:.  
d450: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
d460: 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22  t(interp, "BLOB"
d470: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
d480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d490: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
d4a0: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a  assert(0);.  }..
d4b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
d4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
d4d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d4e0: 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d  int64 STMT colum
d4f0: 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
d500: 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
d510: 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
d520: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
d530: 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65  st as an.** wide
d540: 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65   (64-bit) intege
d550: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
d560: 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
d570: 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  64(.  void * cli
d580: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d590: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d5a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d5b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d5c0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
d5d0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
d5e0: 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56  nt col;.  i64 iV
d5f0: 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
d600: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
d610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d620: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d630: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d640: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
d650: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
d660: 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
d670: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d680: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
d690: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
d6a0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
d6b0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d6c0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
d6d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d6e0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
d6f0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
d700: 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
d710: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d720: 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71  OR;..  iVal = sq
d730: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
d740: 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  64(pStmt, col);.
d750: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
d760: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
d770: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61  ewWideIntObj(iVa
d780: 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
d790: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
d7a0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
d7b0: 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63  lumn_blob STMT c
d7c0: 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
d7d0: 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
d7e0: 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
d7f0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
d800: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d810: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
d820: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
d830: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
d840: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
d850: 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74   int col;..  int
d860: 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   len;.  const vo
d870: 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66  id *pBlob;..  if
d880: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
d890: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d8a0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
d8b0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
d8c0: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
d8d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d8e0: 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
d8f0: 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
d900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d910: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
d920: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
d930: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
d940: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
d950: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
d960: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
d970: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
d980: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
d990: 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
d9a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 42  TCL_ERROR;..  pB
d9b0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
d9c0: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
d9d0: 20 63 6f 6c 29 3b 0a 20 20 6c 65 6e 20 3d 20 73   col);.  len = s
d9e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
d9f0: 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  tes(pStmt, col);
da00: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
da10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
da20: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
da30: 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20  pBlob, len));.  
da40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
da50: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
da60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
da70: 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  uble STMT column
da80: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
da90: 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
daa0: 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
dab0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
dac0: 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a  t as a double..*
dad0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
dae0: 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  t_column_double(
daf0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
db00: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
db10: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
db20: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
db30: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
db40: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
db50: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
db60: 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56  col;.  double rV
db70: 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
db80: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
db90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dba0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
dbb0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
dbc0: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
dbd0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
dbe0: 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
dbf0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
dc00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
dc10: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
dc20: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
dc30: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
dc40: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
dc50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dc60: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
dc70: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
dc80: 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
dc90: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
dca0: 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71  OR;..  rVal = sq
dcb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
dcc0: 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ble(pStmt, col);
dcd0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
dce0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
dcf0: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61  NewDoubleObj(rVa
dd00: 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
dd10: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
dd20: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61  sage: sqlite3_da
dd30: 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  ta_count STMT .*
dd40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dd50: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
dd60: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
dd70: 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
dd80: 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
dd90: 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f  int test_data_co
dda0: 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
ddb0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
ddc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
ddd0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
dde0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
ddf0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
de00: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
de10: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
de20: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
de30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
de40: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
de50: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
de60: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
de70: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
de80: 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
de90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
dea0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
deb0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
dec0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
ded0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
dee0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
def0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
df00: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
df10: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
df20: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74  tObj(sqlite3_dat
df30: 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  a_count(pStmt)))
df40: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
df50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
df60: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
df70: 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
df80: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
df90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
dfa0: 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
dfb0: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
dfc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
dfd0: 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
dfe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
dff0: 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20  est_stmt_utf8(. 
e000: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
e010: 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ta,        /* Po
e020: 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
e030: 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
e040: 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54  be invoke */.  T
e050: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
e060: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
e070: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
e080: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
e090: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
e0a0: 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f  .  int col;.  co
e0b0: 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e  nst char *(*xFun
e0c0: 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
e0d0: 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44  , int) = clientD
e0e0: 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ata;.  const cha
e0f0: 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 69 66 28 20  r *zRet;..  if( 
e100: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
e110: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e120: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
e130: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
e140: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
e150: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e160: 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
e170: 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
e180: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e190: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
e1a0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
e1b0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
e1c0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
e1d0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
e1e0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
e1f0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
e200: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
e210: 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
e220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20  L_ERROR;.  zRet 
e230: 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
e240: 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  ol);.  if( zRet 
e250: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
e260: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
e270: 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20  ar *)zRet, 0);. 
e280: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
e290: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
e2a0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
e2b0: 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
e2c0: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
e2d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e2e0: 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
e2f0: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
e300: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
e310: 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
e320: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
e330: 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28  test_stmt_utf16(
e340: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
e350: 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69  Data,     /* Poi
e360: 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
e370: 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
e380: 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
e390: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
e3a0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
e3b0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
e3c0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
e3d0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
e3e0: 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63  .  int col;.  Tc
e3f0: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63  l_Obj *pRet;.  c
e400: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
e410: 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16;.  const void
e420: 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74   *(*xFunc)(sqlit
e430: 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d  e3_stmt*, int) =
e440: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
e450: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
e460: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
e480: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
e490: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
e4a0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
e4b0: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
e4c0: 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
e4d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e4e0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
e4f0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
e500: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
e510: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
e520: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
e530: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
e540: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
e550: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
e560: 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
e570: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
e580: 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28  zName16 = xFunc(
e590: 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69  pStmt, col);.  i
e5a0: 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20  f( zName16 ){.  
e5b0: 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
e5c0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61  ByteArrayObj(zNa
e5d0: 6d 65 31 36 2c 20 73 71 6c 69 74 65 33 75 74 66  me16, sqlite3utf
e5e0: 31 36 42 79 74 65 4c 65 6e 28 7a 4e 61 6d 65 31  16ByteLen(zName1
e5f0: 36 2c 20 2d 31 29 2b 32 29 3b 0a 20 20 20 20 54  6, -1)+2);.    T
e600: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
e610: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
e620: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
e630: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
e640: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
e650: 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c  umn_int STMT col
e660: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
e670: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e680: 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d  bytes STMT colum
e690: 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
e6a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
e6b0: 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d  tes16 STMT colum
e6c0: 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n.**.*/.static i
e6d0: 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  nt test_stmt_int
e6e0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
e6f0: 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69  tData,    /* Poi
e700: 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
e710: 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
e720: 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
e730: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
e740: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
e750: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
e760: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
e770: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
e780: 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e  .  int col;.  in
e790: 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  t (*xFunc)(sqlit
e7a0: 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d  e3_stmt*, int) =
e7b0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
e7c0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
e7d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e7e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
e7f0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
e800: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
e810: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
e820: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
e830: 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
e840: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e850: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
e860: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
e870: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
e880: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
e890: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
e8a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
e8b0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
e8c0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
e8d0: 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
e8e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
e8f0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e900: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
e910: 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74  IntObj(xFunc(pSt
e920: 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65  mt, col)));.  re
e930: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
e940: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
e950: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
e960: 72 69 74 65 20 3c 66 69 6c 65 6e 61 6d 65 3e 0a  rite <filename>.
e970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
e980: 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  st_sqlite3OsOpen
e990: 52 65 61 64 57 72 69 74 65 28 0a 20 20 76 6f 69  ReadWrite(.  voi
e9a0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
e9b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e9c0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
e9d0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
e9e0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f  ST objv[].){.  O
e9f0: 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20  sFile * pFile;. 
ea00: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 64   int rc;.  int d
ea10: 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a 42 75  ummy;.  char zBu
ea20: 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  f[100];..  if( o
ea30: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
ea40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ea50: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
ea60: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
ea70: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
ea80: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ea90: 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 22  0]), " filename"
eaa0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
eab0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
eac0: 0a 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  .  pFile = sqlit
ead0: 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 4f  eMalloc(sizeof(O
eae0: 73 46 69 6c 65 29 29 3b 0a 20 20 72 63 20 3d 20  sFile));.  rc = 
eaf0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
eb00: 64 57 72 69 74 65 28 54 63 6c 5f 47 65 74 53 74  dWrite(Tcl_GetSt
eb10: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 70  ring(objv[1]), p
eb20: 46 69 6c 65 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  File, &dummy);. 
eb30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
eb40: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
eb50: 46 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  Free(pFile);.   
eb60: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
eb70: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
eb80: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
eb90: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
eba0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ebb0: 0a 20 20 7d 0a 20 20 6d 61 6b 65 50 6f 69 6e 74  .  }.  makePoint
ebc0: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
ebd0: 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 54 63  uf, pFile);.  Tc
ebe0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
ebf0: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
ec00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ec10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
ec20: 3a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  :  sqlite3OsClos
ec30: 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a  e <file handle>.
ec40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
ec50: 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  st_sqlite3OsClos
ec60: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
ec70: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ec80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ec90: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
eca0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ecb0: 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20  ].){.  OsFile * 
ecc0: 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pFile;.  int rc;
ecd0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
ece0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
ecf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ed00: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
ed10: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
ed20: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
ed30: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
ed40: 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b  filehandle", 0);
ed50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ed60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
ed70: 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  ( getFilePointer
ed80: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
ed90: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
eda0: 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20   &pFile) ){.    
edb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
edc0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
edd0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 46 69 6c  ite3OsClose(pFil
ede0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
edf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
ee00: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ee10: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72  erp, (char *)err
ee20: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
ee30: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
ee40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ee50: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
ee60: 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e  pFile);.  return
ee70: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
ee80: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
ee90: 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65 20 68 61  3OsLock <file ha
eea0: 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79 70 65 3e  ndle> <locktype>
eeb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
eec0: 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63  est_sqlite3OsLoc
eed0: 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  k(.  void * clie
eee0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
eef0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ef00: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ef10: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ef20: 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20  ].){.  OsFile * 
ef30: 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pFile;.  int rc;
ef40: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
ef50: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
ef60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ef70: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
ef80: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
ef90: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
efa0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a  ring(objv[0]), .
efb0: 20 20 20 20 20 20 20 20 22 20 66 69 6c 65 68 61          " fileha
efc0: 6e 64 6c 65 20 28 53 48 41 52 45 44 7c 52 45 53  ndle (SHARED|RES
efd0: 45 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c 45 58  ERVED|PENDING|EX
efe0: 43 4c 55 53 49 56 45 29 22 2c 20 30 29 3b 0a 20  CLUSIVE)", 0);. 
eff0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f000: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
f010: 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69  getFilePointer(i
f020: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f030: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f040: 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  pFile) ){.    re
f050: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f060: 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d 73 74    }..  if( 0==st
f070: 72 63 6d 70 28 22 53 48 41 52 45 44 22 2c 20 54  rcmp("SHARED", T
f080: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f090: 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63  v[2])) ){.    rc
f0a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
f0b0: 28 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  (pFile, SHARED_L
f0c0: 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  OCK);.  }.  else
f0d0: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22   if( 0==strcmp("
f0e0: 52 45 53 45 52 56 45 44 22 2c 20 54 63 6c 5f 47  RESERVED", Tcl_G
f0f0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
f100: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  )) ){.    rc = s
f110: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69  qlite3OsLock(pFi
f120: 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  le, RESERVED_LOC
f130: 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69  K);.  }.  else i
f140: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 50 45  f( 0==strcmp("PE
f150: 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47 65 74 53  NDING", Tcl_GetS
f160: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
f170: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
f180: 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c  te3OsLock(pFile,
f190: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 3b 0a   PENDING_LOCK);.
f1a0: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30    }.  else if( 0
f1b0: 3d 3d 73 74 72 63 6d 70 28 22 45 58 43 4c 55 53  ==strcmp("EXCLUS
f1c0: 49 56 45 22 2c 20 54 63 6c 5f 47 65 74 53 74 72  IVE", Tcl_GetStr
f1d0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b  ing(objv[2])) ){
f1e0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f1f0: 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 45  3OsLock(pFile, E
f200: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
f210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
f220: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f230: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
f240: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
f250: 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54 63 6c  "", .        Tcl
f260: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
f270: 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22 20  0]), .        " 
f280: 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48 41 52  filehandle (SHAR
f290: 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45 4e 44  ED|RESERVED|PEND
f2a0: 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29 22 2c  ING|EXCLUSIVE)",
f2b0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
f2c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
f2d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f2e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
f2f0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f300: 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61   (char *)errorNa
f310: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
f320: 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
f330: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f340: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f350: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
f360: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
f370: 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a 2a   <file handle>.*
f380: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
f390: 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  t_sqlite3OsUnloc
f3a0: 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  k(.  void * clie
f3b0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
f3c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
f3d0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
f3e0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
f3f0: 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20  ].){.  OsFile * 
f400: 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pFile;.  int rc;
f410: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
f420: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f430: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f440: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
f450: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
f460: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
f470: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
f480: 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b  filehandle", 0);
f490: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f4a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
f4b0: 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  ( getFilePointer
f4c0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
f4d0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
f4e0: 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20   &pFile) ){.    
f4f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f500: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f510: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 69  ite3OsUnlock(pFi
f520: 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
f530: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f540: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
f550: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
f560: 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65  char *)errorName
f570: 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
f580: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f590: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
f5a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f5b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
f5c0: 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74   commands with t
f5d0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
f5e0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74  er..*/.int Sqlit
f5f0: 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
f600: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
f610: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
f620: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
f630: 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
f640: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
f650: 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
f660: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  rn int sqlite3_o
f670: 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a  pen_file_count;.
f680: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
f690: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
f6a0: 65 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  e;.  static stru
f6b0: 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
f6c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
f6d0: 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
f6e0: 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20    } aCmd[] = {. 
f6f0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
f700: 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
f710: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
f720: 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
f730: 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20  intf_int    },. 
f740: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
f750: 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20  printf_int64",  
f760: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
f770: 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
f780: 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20  intf_int64  },. 
f790: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
f7a0: 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20  printf_str",    
f7b0: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
f7c0: 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
f7d0: 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20  intf_str    },. 
f7e0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
f7f0: 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20  printf_double", 
f800: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
f810: 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
f820: 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20  intf_double },. 
f830: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
f840: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20  printf_scaled", 
f850: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
f860: 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
f870: 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20  intf_scaled },. 
f880: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
f890: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20  printf_z_test", 
f8a0: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
f8b0: 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
f8c0: 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_z        },.  
f8d0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61     { "sqlite3_la
f8e0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
f8f0: 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72  ,     (Tcl_CmdPr
f900: 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f  oc*)test_last_ro
f910: 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  wid       },.   
f920: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
f930: 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20  c_printf",      
f940: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
f950: 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69  c*)test_exec_pri
f960: 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ntf      },.    
f970: 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f   { "sqlite3_get_
f980: 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20  table_printf",  
f990: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
f9a0: 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65  *)test_get_table
f9b0: 5f 70 72 69 6e 74 66 20 7d 2c 0a 20 20 20 20 20  _printf },.     
f9c0: 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  { "sqlite3_close
f9d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
f9e0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
f9f0: 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f  )sqlite_test_clo
fa00: 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  se     },.     {
fa10: 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
fa20: 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  _function",     
fa30: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
fa40: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
fa50: 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20  tion  },.     { 
fa60: 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
fa70: 61 67 67 72 65 67 61 74 65 22 2c 20 20 20 20 20  aggregate",     
fa80: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
fa90: 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65  est_create_aggre
faa0: 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22  gate },.     { "
fab0: 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f  sqlite_register_
fac0: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
fad0: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
fae0: 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63  st_register_func
faf0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
fb00: 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20 20  qlite_abort",   
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
fb20: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
fb30: 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20 20  ite_abort       
fb40: 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c     },.#ifdef SQL
fb50: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 7b  ITE_DEBUG.     {
fb60: 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f   "sqlite_malloc_
fb70: 66 61 69 6c 22 2c 20 20 20 20 20 20 20 20 20 20  fail",          
fb80: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
fb90: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
fba0: 69 6c 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  il    },.     { 
fbb0: 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73  "sqlite_malloc_s
fbc0: 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  tat",           
fbd0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
fbe0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61  qlite_malloc_sta
fbf0: 74 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  t    },.#endif. 
fc00: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62 69      { "sqlite_bi
fc10: 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nd",            
fc20: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
fc30: 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20  Proc*)test_bind 
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
fc50: 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e      { "breakpoin
fc60: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
fc70: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
fc80: 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61 6b  Proc*)test_break
fc90: 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20  point       },. 
fca0: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   };.  static str
fcb0: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
fcc0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
fcd0: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
fce0: 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63  oc;.     void *c
fcf0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61  lientData;.  } a
fd00: 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
fd10: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
fd20: 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  d_int",         
fd30: 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
fd40: 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  nt,      0 },.  
fd50: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
fd60: 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  nd_int64",      
fd70: 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
fd80: 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20  int64,    0 },. 
fd90: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
fda0: 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ind_double",    
fdb0: 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
fdc0: 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a  _double,   0 },.
fdd0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
fde0: 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20  bind_null",     
fdf0: 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
fe00: 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c  d_null     ,0 },
fe10: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
fe20: 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20  _bind_text",    
fe30: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
fe40: 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d  nd_text     ,0 }
fe50: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
fe60: 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20  3_bind_text16", 
fe70: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
fe80: 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20  ind_text16   ,0 
fe90: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
fea0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20  e3_bind_blob",  
feb0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
fec0: 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30  bind_blob     ,0
fed0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
fee0: 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20 20 20  te3_errcode",   
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
ff00: 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20 20 2c  _errcode       ,
ff10: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
ff20: 69 74 65 33 5f 65 72 72 6d 73 67 22 2c 20 20 20  ite3_errmsg",   
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
ff40: 74 5f 65 72 72 6d 73 67 20 20 20 20 20 20 20 20  t_errmsg        
ff50: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
ff60: 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 22 2c  lite3_errmsg16",
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
ff80: 73 74 5f 65 72 72 6d 73 67 31 36 20 20 20 20 20  st_errmsg16     
ff90: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
ffa0: 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20 20 20  qlite3_open",   
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
ffc0: 65 73 74 5f 6f 70 65 6e 20 20 20 20 20 20 20 20  est_open        
ffd0: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
ffe0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 22 2c  sqlite3_open16",
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 74 65 73 74 5f 6f 70 65 6e 31 36 20 20 20 20 20  test_open16     
10010 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
10020 22 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74  "sqlite3_complet
10030 65 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  e16",           
10040 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36   test_complete16
10050 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20      ,0 },..     
10060 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
10070 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  re",            
10080 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 20     test_prepare 
10090 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
100a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
100b0 61 72 65 31 36 22 2c 20 20 20 20 20 20 20 20 20  are16",         
100c0 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
100d0 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  16     ,0 },.   
100e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e    { "sqlite3_fin
100f0 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  alize",         
10100 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69       test_finali
10110 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ze      ,0 },.  
10120 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65     { "sqlite3_re
10130 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  set",           
10140 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65 74        test_reset
10150 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
10160 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
10170 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
10180 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
10190 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
101a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
101b0 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
101c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
101d0 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
101e0 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ..     /* sqlite
101f0 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49  3_column_*() API
10200 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   */.     { "sqli
10210 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
10220 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
10230 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c  _column_count  ,
10240 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
10250 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22  ite3_data_count"
10260 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
10270 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20  t_data_count    
10280 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
10290 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
102a0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  e",           te
102b0 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20  st_column_type  
102c0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
102d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
102e0 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  ob",           t
102f0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  est_column_blob 
10300 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
10310 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
10320 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  ouble",         
10330 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
10340 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  le ,0 },.     { 
10350 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
10360 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
10370 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
10380 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  64  ,0 },.     {
10390 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
103a0 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 74 65  _int",        te
103b0 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 73  st_stmt_int,   s
103c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
103d0 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  t       },.     
103e0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
103f0 6e 5f 62 79 74 65 73 22 2c 20 20 20 20 20 20 74  n_bytes",      t
10400 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
10410 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
10420 79 74 65 73 20 20 20 20 20 7d 2c 0a 20 20 20 20  ytes     },.    
10430 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
10440 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20 20 20  mn_bytes16",    
10450 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
10460 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10470 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20 20 20  bytes16   },.   
10480 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
10490 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 20 20 20  umn_text",      
104a0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
104b0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
104c0 5f 74 65 78 74 20 20 20 20 20 20 7d 2c 0a 20 20  _text      },.  
104d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
104e0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 20  lumn_decltype", 
104f0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
10500 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ,  sqlite3_colum
10510 6e 5f 64 65 63 6c 74 79 70 65 20 20 7d 2c 0a 20  n_decltype  },. 
10520 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
10530 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 20  olumn_name",    
10540 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
10550 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  8,  sqlite3_colu
10560 6d 6e 5f 6e 61 6d 65 20 20 20 20 20 20 7d 2c 0a  mn_name      },.
10570 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10580 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20  column_text16", 
10590 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74      test_stmt_ut
105a0 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  f16, sqlite3_col
105b0 75 6d 6e 5f 74 65 78 74 31 36 20 20 20 20 7d 2c  umn_text16    },
105c0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
105d0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
105e0 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  16", test_stmt_u
105f0 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f  tf16, sqlite3_co
10600 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d  lumn_decltype16}
10610 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
10620 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22  3_column_name16"
10630 2c 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  ,     test_stmt_
10640 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63  utf16, sqlite3_c
10650 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 20 20 20 20  olumn_name16    
10660 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63  },..     /* Func
10670 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20  tions from os.h 
10680 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  */.     { "sqlit
10690 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
106a0 65 22 2c 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  e",test_sqlite3O
106b0 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 2c 20  sOpenReadWrite, 
106c0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
106d0 69 74 65 33 4f 73 43 6c 6f 73 65 22 2c 20 20 20  ite3OsClose",   
106e0 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65       test_sqlite
106f0 33 4f 73 43 6c 6f 73 65 2c 20 30 20 7d 2c 0a 20  3OsClose, 0 },. 
10700 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73      { "sqlite3Os
10710 4c 6f 63 6b 22 2c 20 20 20 20 20 20 20 20 20 74  Lock",         t
10720 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63  est_sqlite3OsLoc
10730 6b 2c 20 30 20 7d 2c 0a 20 20 20 0a 20 20 20 20  k, 0 },.   .    
10740 20 2f 2a 20 43 75 73 74 6f 6d 20 74 65 73 74 20   /* Custom test 
10750 69 6e 74 65 72 66 61 63 65 73 20 2a 2f 0a 20 20  interfaces */.  
10760 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 55     { "sqlite3OsU
10770 6e 6c 6f 63 6b 22 2c 20 20 20 20 20 20 20 20 20  nlock",         
10780 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e  test_sqlite3OsUn
10790 6c 6f 63 6b 2c 20 30 20 20 20 20 7d 2c 0a 20 20  lock, 0    },.  
107a0 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63     { "add_test_c
107b0 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
107c0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20  test_collate, 0 
107d0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
107e0 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63     { "add_test_c
107f0 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20  ollate_needed", 
10800 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
10810 64 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20  ded, 0     },.  
10820 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66     { "add_test_f
10830 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
10840 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30  test_function, 0
10850 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
10860 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
10870 61 73 68 70 61 72 61 6d 73 22 2c 20 20 20 20 20  ashparams",     
10880 73 71 6c 69 74 65 33 5f 63 72 61 73 68 70 61 72  sqlite3_crashpar
10890 61 6d 73 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20  ams, 0     },.  
108a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65     { "sqlite3_te
108b0 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20 20 20  st_errstr",     
108c0 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30 20 20  test_errstr, 0  
108d0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 0a 20             },.. 
108e0 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65   };.  int i;.  e
108f0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
10900 33 5f 6f 73 5f 74 72 61 63 65 3b 0a 0a 20 20 66  3_os_trace;..  f
10910 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
10920 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43  (aCmd)/sizeof(aC
10930 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
10940 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
10950 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64  and(interp, aCmd
10960 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b  [i].zName, aCmd[
10970 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b  i].xProc, 0, 0);
10980 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
10990 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  i<sizeof(aObjCmd
109a0 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  )/sizeof(aObjCmd
109b0 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
109c0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
109d0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62  mand(interp, aOb
109e0 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a  jCmd[i].zName, .
109f0 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b          aObjCmd[
10a00 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d  i].xProc, aObjCm
10a10 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c  d[i].clientData,
10a20 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c   0);.  }.  Tcl_L
10a30 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
10a40 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f  sqlite_search_co
10a50 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
10a60 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61  ar*)&sqlite3_sea
10a70 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  rch_count, TCL_L
10a80 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
10a90 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
10aa0 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70  "sqlite_interrup
10ab0 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  t_count", .     
10ac0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
10ad0 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
10ae0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
10af0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
10b00 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
10b10 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c  pen_file_count",
10b20 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
10b30 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
10b40 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
10b50 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
10b60 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
10b70 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69  qlite_current_ti
10b80 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  me", .      (cha
10b90 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75 72 72  r*)&sqlite3_curr
10ba0 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49  ent_time, TCL_LI
10bb0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
10bc0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
10bd0 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22  sqlite_os_trace"
10be0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
10bf0 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65  sqlite3_os_trace
10c00 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
10c10 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
10c20 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
10c30 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
10c40 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
10c50 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  &sqlite_static_b
10c60 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f 4c  ind_value, TCL_L
10c70 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 72  INK_STRING);.  r
10c80 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.