/ Hex Artifact Content
Login

Artifact 896580d200136ed369154dbf52ee76d1ebfc4b2e:


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 38 20 32 30 30 34 2f 30 38 2f  ,v 1.98 2004/08/
0240: 32 30 20 31 36 3a 30 32 3a 33 39 20 64 72 68 20  20 16:02:39 drh 
0250: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0260: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0270: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22  #include "tcl.h"
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
0290: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
02a0: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  b.h>.#include <s
02b0: 74 72 69 6e 67 2e 68 3e 0a 0a 23 69 66 20 4f 53  tring.h>..#if OS
02c0: 5f 57 49 4e 0a 23 20 64 65 66 69 6e 65 20 50 54  _WIN.# define PT
02d0: 52 5f 46 4d 54 20 22 25 78 22 0a 23 65 6c 73 65  R_FMT "%x".#else
02e0: 0a 23 20 64 65 66 69 6e 65 20 50 54 52 5f 46 4d  .# define PTR_FM
02f0: 54 20 22 25 70 22 0a 23 65 6e 64 69 66 0a 0a 73  T "%p".#endif..s
0300: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
0310: 20 2a 20 65 72 72 6f 72 4e 61 6d 65 28 69 6e 74   * errorName(int
0320: 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   rc){.  const ch
0330: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
0340: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
0350: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
0360: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
0370: 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20   = "SQLITE_OK"; 
0380: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
0390: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
03a0: 45 52 52 4f 52 3a 20 20 20 20 20 20 7a 4e 61 6d  ERROR:      zNam
03b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
03c0: 52 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  R";       break;
03d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
03e0: 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 7a 4e 61  _INTERNAL:   zNa
03f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
0400: 45 52 4e 41 4c 22 3b 20 20 20 20 62 72 65 61 6b  ERNAL";    break
0410: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0420: 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 7a 4e  E_PERM:       zN
0430: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
0440: 52 4d 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  RM";        brea
0450: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0460: 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 7a  TE_ABORT:      z
0470: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
0480: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 62 72 65  BORT";       bre
0490: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
04a0: 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20  ITE_BUSY:       
04b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
04c0: 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 62 72  BUSY";        br
04d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
04e0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20  LITE_LOCKED:    
04f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0500: 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 62  _LOCKED";      b
0510: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0520: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
0530: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0540: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
0550: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0560: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
0570: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0580: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
0590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
05a0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
05b0: 54 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  T:  zName = "SQL
05c0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20  ITE_INTERRUPT"; 
05d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
05e0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
05f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0600: 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20  LITE_IOERR";    
0610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0620: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
0630: 54 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  T:    zName = "S
0640: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
0650: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0660: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  ase SQLITE_NOTFO
0670: 55 4e 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  UND:   zName = "
0680: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
0690: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
06a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c  case SQLITE_FULL
06b0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
06c0: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
06d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
06e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
06f0: 54 4f 50 45 4e 3a 20 20 20 7a 4e 61 6d 65 20 3d  TOPEN:   zName =
0700: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
0710: 4e 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  N";    break;.  
0720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
0730: 4f 54 4f 43 4f 4c 3a 20 20 20 7a 4e 61 6d 65 20  OTOCOL:   zName 
0740: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
0750: 4f 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  OL";    break;. 
0760: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
0770: 4d 50 54 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  MPTY:      zName
0780: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
0790: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
07a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
07b0: 53 43 48 45 4d 41 3a 20 20 20 20 20 7a 4e 61 6d  SCHEMA:     zNam
07c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
07d0: 4d 41 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  MA";      break;
07e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
07f0: 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 7a 4e 61  _TOOBIG:     zNa
0800: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f  me = "SQLITE_TOO
0810: 42 49 47 22 3b 20 20 20 20 20 20 62 72 65 61 6b  BIG";      break
0820: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0830: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 4e  E_CONSTRAINT: zN
0840: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
0850: 4e 53 54 52 41 49 4e 54 22 3b 20 20 62 72 65 61  NSTRAINT";  brea
0860: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0870: 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 7a  TE_MISMATCH:   z
0880: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
0890: 49 53 4d 41 54 43 48 22 3b 20 20 20 20 62 72 65  ISMATCH";    bre
08a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
08b0: 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20  ITE_MISUSE:     
08c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
08d0: 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 62 72  MISUSE";      br
08e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
08f0: 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20  LITE_NOLFS:     
0900: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0910: 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 62  _NOLFS";       b
0920: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0930: 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20  QLITE_AUTH:     
0940: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0950: 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20  E_AUTH";        
0960: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0970: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20  SQLITE_FORMAT:  
0980: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0990: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
09a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
09b0: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20   SQLITE_RANGE:  
09c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
09d0: 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20  ITE_RANGE";     
09e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
09f0: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
0a00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0a10: 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20  LITE_ROW";      
0a20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0a30: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
0a40: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0a50: 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20  QLITE_DONE";    
0a60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0a70: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  ase SQLITE_NOTAD
0a80: 42 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  B:     zName = "
0a90: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20  SQLITE_NOTADB"; 
0aa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ab0: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
0ac0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
0ad0: 3d 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77  = "SQLITE_Unknow
0ae0: 6e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  n";     break;. 
0af0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
0b00: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  e;.}../*.** Deco
0b10: 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  de a pointer to 
0b20: 61 6e 20 73 71 6c 69 74 65 20 6f 62 6a 65 63 74  an sqlite object
0b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0b40: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0b50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0b60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0b70: 20 73 71 6c 69 74 65 20 2a 2a 70 70 44 62 29 7b   sqlite **ppDb){
0b80: 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28 7a 41  .  if( sscanf(zA
0b90: 2c 20 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64  , PTR_FMT, (void
0ba0: 2a 2a 29 70 70 44 62 29 21 3d 31 20 26 26 20 0a  **)ppDb)!=1 && .
0bb0: 20 20 20 20 20 20 28 7a 41 5b 30 5d 21 3d 27 30        (zA[0]!='0
0bc0: 27 20 7c 7c 20 7a 41 5b 31 5d 21 3d 27 78 27 20  ' || zA[1]!='x' 
0bd0: 7c 7c 20 73 73 63 61 6e 66 28 26 7a 41 5b 32 5d  || sscanf(&zA[2]
0be0: 2c 20 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64  , PTR_FMT, (void
0bf0: 2a 2a 29 70 70 44 62 29 21 3d 31 29 0a 20 20 29  **)ppDb)!=1).  )
0c00: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
0c10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
0c20: 5c 22 22 2c 20 7a 41 2c 20 22 5c 22 20 69 73 20  \"", zA, "\" is 
0c30: 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  not a valid poin
0c40: 74 65 72 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a  ter value", 0);.
0c50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
0c60: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
0c70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0c80: 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69  .** Decode a poi
0c90: 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
0ca0: 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a  e3_stmt object..
0cb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
0cc0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20  tStmtPointer(.  
0cd0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0ce0: 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  rp, .  const cha
0cf0: 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c  r *zArg,  .  sql
0d00: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
0d10: 6d 74 0a 29 7b 0a 20 20 69 66 28 20 73 73 63 61  mt.){.  if( ssca
0d20: 6e 66 28 7a 41 72 67 2c 20 50 54 52 5f 46 4d 54  nf(zArg, PTR_FMT
0d30: 2c 20 28 76 6f 69 64 2a 2a 29 70 70 53 74 6d 74  , (void**)ppStmt
0d40: 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )!=1 ){.    Tcl_
0d50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0d60: 65 72 70 2c 20 22 5c 22 22 2c 20 7a 41 72 67 2c  erp, "\"", zArg,
0d70: 20 22 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61   "\" is not a va
0d80: 6c 69 64 20 70 6f 69 6e 74 65 72 20 76 61 6c 75  lid pointer valu
0d90: 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
0da0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0db0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0dc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
0dd0: 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  de a pointer to 
0de0: 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  an sqlite3_stmt 
0df0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
0e00: 63 20 69 6e 74 20 67 65 74 46 69 6c 65 50 6f 69  c int getFilePoi
0e10: 6e 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65  nter(.  Tcl_Inte
0e20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63  rp *interp, .  c
0e30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c  onst char *zArg,
0e40: 20 20 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 70    .  OsFile **pp
0e50: 46 69 6c 65 0a 29 7b 0a 20 20 69 66 28 20 73 73  File.){.  if( ss
0e60: 63 61 6e 66 28 7a 41 72 67 2c 20 50 54 52 5f 46  canf(zArg, PTR_F
0e70: 4d 54 2c 20 28 76 6f 69 64 2a 2a 29 70 70 46 69  MT, (void**)ppFi
0e80: 6c 65 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  le)!=1 ){.    Tc
0e90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0ea0: 6e 74 65 72 70 2c 20 22 5c 22 22 2c 20 7a 41 72  nterp, "\"", zAr
0eb0: 67 2c 20 22 5c 22 20 69 73 20 6e 6f 74 20 61 20  g, "\" is not a 
0ec0: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 20 76 61  valid pointer va
0ed0: 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  lue", 0);.    re
0ee0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0ef0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
0f00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
0f10: 6e 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65  nerate a text re
0f20: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
0f30: 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63  a pointer that c
0f40: 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64  an be understood
0f50: 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62  .** by the getDb
0f60: 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56  Pointer and getV
0f70: 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65  mPointer routine
0f80: 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  s above..**.** T
0f90: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f  he problem is, o
0fa0: 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20  n some machines 
0fb0: 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75  (Solaris) if you
0fc0: 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74   do a printf wit
0fd0: 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61  h.** "%p" you ca
0fe0: 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64  nnot turn around
0ff0: 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20   and do a scanf 
1000: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25  with the same "%
1010: 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f  p" and.** get yo
1020: 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e  ur pointer back.
1030: 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72    You have to pr
1040: 65 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66  epend a "0x" bef
1050: 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77  ore it will.** w
1060: 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73  ork.  Or at leas
1070: 74 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  t that is what i
1080: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
1090: 20 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69   (drh).  But thi
10a0: 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61  s.** behavior va
10b0: 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e  ries from machin
10c0: 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54  e to machine.  T
10d0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64  he solution used
10e0: 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65   her is.** to te
10f0: 73 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69  st the string ri
1100: 67 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20  ght after it is 
1110: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65  generated to see
1120: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1130: 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73   understood by s
1140: 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74  canf, and if not
1150: 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67  , try prepending
1160: 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20   an "0x" to see 
1170: 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73  if.** that helps
1180: 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f  .  If nothing wo
1190: 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72  rks, a fatal err
11a0: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  or is generated.
11b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
11c0: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63  akePointerStr(Tc
11d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11e0: 2c 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f  , char *zPtr, vo
11f0: 69 64 20 2a 70 29 7b 0a 20 20 76 6f 69 64 20 2a  id *p){.  void *
1200: 70 32 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 50  p2;.  sprintf(zP
1210: 74 72 2c 20 50 54 52 5f 46 4d 54 2c 20 70 29 3b  tr, PTR_FMT, p);
1220: 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28 7a 50  .  if( sscanf(zP
1230: 74 72 2c 20 50 54 52 5f 46 4d 54 2c 20 26 70 32  tr, PTR_FMT, &p2
1240: 29 21 3d 31 20 7c 7c 20 70 32 21 3d 70 20 29 7b  )!=1 || p2!=p ){
1250: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 50 74  .    sprintf(zPt
1260: 72 2c 20 22 30 78 22 20 50 54 52 5f 46 4d 54 2c  r, "0x" PTR_FMT,
1270: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 73 73 63   p);.    if( ssc
1280: 61 6e 66 28 7a 50 74 72 2c 20 50 54 52 5f 46 4d  anf(zPtr, PTR_FM
1290: 54 2c 20 26 70 32 29 21 3d 31 20 7c 7c 20 70 32  T, &p2)!=1 || p2
12a0: 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=p ){.      Tcl
12b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12c0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
12d0: 20 63 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74   convert a point
12e0: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 22  er to a string "
12f0: 0a 20 20 20 20 20 20 20 20 20 22 69 6e 20 74 68  .         "in th
1300: 65 20 66 69 6c 65 20 22 20 5f 5f 46 49 4c 45 5f  e file " __FILE_
1310: 5f 20 22 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  _ " in function 
1320: 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 29  makePointerStr()
1330: 2e 20 20 50 6c 65 61 73 65 20 22 0a 20 20 20 20  .  Please ".    
1340: 20 20 20 20 20 22 72 65 70 6f 72 74 20 74 68 69       "report thi
1350: 73 20 70 72 6f 62 6c 65 6d 20 74 6f 20 74 68 65  s problem to the
1360: 20 53 51 4c 69 74 65 20 6d 61 69 6c 69 6e 67 20   SQLite mailing 
1370: 6c 69 73 74 20 6f 72 20 61 73 20 61 20 6e 65 77  list or as a new
1380: 20 62 75 74 20 22 0a 20 20 20 20 20 20 20 20 20   but ".         
1390: 22 72 65 70 6f 72 74 2e 20 20 50 6c 65 61 73 65  "report.  Please
13a0: 20 70 72 6f 76 69 64 65 20 64 65 74 61 69 6c 65   provide detaile
13b0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
13c0: 6f 75 74 20 68 6f 77 20 79 6f 75 20 63 6f 6d 70  out how you comp
13d0: 69 6c 65 64 20 22 0a 20 20 20 20 20 20 20 20 20  iled ".         
13e0: 22 53 51 4c 69 74 65 20 61 6e 64 20 77 68 61 74  "SQLite and what
13f0: 20 63 6f 6d 70 75 74 65 72 20 79 6f 75 20 61 72   computer you ar
1400: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e 22 2c 20  e running on.", 
1410: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
1420: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1430: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  }.  }.  return T
1440: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1450: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  The callback rou
1460: 74 69 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33  tine for sqlite3
1470: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a  _exec_printf()..
1480: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1490: 65 63 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69  ec_printf_cb(voi
14a0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67  d *pArg, int arg
14b0: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20  c, char **argv, 
14c0: 63 68 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20  char **name){.  
14d0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72  Tcl_DString *str
14e0: 20 3d 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a   = (Tcl_DString*
14f0: 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  )pArg;.  int i;.
1500: 0a 20 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69  .  if( Tcl_DStri
1510: 6e 67 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30  ngLength(str)==0
1520: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
1530: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
1540: 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67       Tcl_DString
1550: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
1560: 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d  r, name[i] ? nam
1570: 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  e[i] : "NULL");.
1580: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
1590: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
15a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ){.    Tcl_DStri
15b0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
15c0: 73 74 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61  str, argv[i] ? a
15d0: 72 67 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29  rgv[i] : "NULL")
15e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
15f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1600: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
1610: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
1620: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
1630: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
1640: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
1650: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
1660: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
1670: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
1680: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
1690: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
16a0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
16b0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
16c0: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
16d0: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
16e0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
16f0: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
1700: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
1710: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
1720: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1730: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1740: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1750: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1760: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1770: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1780: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1790: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
17a0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
17b0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
17c0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
17d0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
17e0: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
17f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
1800: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
1810: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
1820: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1830: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
1840: 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a   if( argc!=4 ){.
1850: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1860: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1870: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1880: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1890: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
18a0: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22 2c   FORMAT STRING",
18b0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
18c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
18d0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
18e0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
18f0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1900: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1910: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
1920: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
1930: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
1940: 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29 3b  gv[2], argv[3]);
1950: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1960: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65  exec(db, zSql, e
1970: 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26  xec_printf_cb, &
1980: 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73  str, &zErr);.  s
1990: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
19a0: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  );.  sprintf(zBu
19b0: 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20  f, "%d", rc);.  
19c0: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
19d0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
19e0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
19f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d  ment(interp, rc=
1a00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c  =SQLITE_OK ? Tcl
1a10: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
1a20: 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54  tr) : zErr);.  T
1a30: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
1a40: 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  str);.  if( zErr
1a50: 20 29 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20   ) free(zErr);. 
1a60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1a80: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1a90: 5f 7a 5f 74 65 73 74 20 20 53 45 50 41 52 41 54  _z_test  SEPARAT
1aa0: 4f 52 20 20 41 52 47 30 20 20 41 52 47 31 20 2e  OR  ARG0  ARG1 .
1ab0: 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ...**.** Test th
1ac0: 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66 20 6d  e %z format of m
1ad0: 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20 6d  printf().  Use m
1ae0: 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66 28  ultiple mprintf(
1af0: 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63  ) calls to .** c
1b00: 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30 20  oncatenate arg0 
1b10: 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73 69  through argn usi
1b20: 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61 73 20  ng separator as 
1b30: 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  the separator..*
1b40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73  * Return the res
1b50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
1b60: 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  nt test_mprintf_
1b70: 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  z(.  void *NotUs
1b80: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
1b90: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1ba0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1bb0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1bc0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1bd0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
1be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bf0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1c00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
1c10: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
1c20: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
1c30: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
1c40: 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b  ar *zResult = 0;
1c50: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72  .  int i;..  for
1c60: 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=2; i<argc; i+
1c70: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
1c80: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1c90: 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73 75  ("%z%s%s", zResu
1ca0: 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67  lt, argv[1], arg
1cb0: 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  v[i]);.  }.  Tcl
1cc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1cd0: 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20 30  terp, zResult, 0
1ce0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
1cf0: 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75  zResult);.  retu
1d00: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1d10: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1d20: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
1d30: 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54  intf  DB  FORMAT
1d40: 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49    STRING.**.** I
1d50: 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65  nvoke the sqlite
1d60: 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  3_get_table_prin
1d70: 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 75  tf() interface u
1d80: 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61  sing the open da
1d90: 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54  tabase.** DB.  T
1da0: 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73 74  he SQL is the st
1db0: 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54 68  ring FORMAT.  Th
1dc0: 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  e format string 
1dd0: 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a  should contain.*
1de0: 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e 20  * one %s or %q. 
1df0: 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20 76   STRING is the v
1e00: 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e  alue inserted in
1e10: 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a  to %s or %q..*/.
1e20: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e30: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
1e40: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1e50: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1e60: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1e70: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1e80: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1e90: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1ea0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ec0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ed0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ef0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1f00: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
1f10: 69 74 65 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44  ite *db;.  Tcl_D
1f20: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
1f30: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
1f40: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  rr = 0;.  int nR
1f50: 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  ow, nCol;.  char
1f60: 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e   **aResult;.  in
1f70: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
1f80: 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53  [30];.  char *zS
1f90: 71 6c 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ql;.  if( argc!=
1fa0: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1fb0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fc0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1fd0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1fe0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1ff0: 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52   " DB FORMAT STR
2000: 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ING", 0);.    re
2010: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2020: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2030: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2040: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2050: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2060: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
2070: 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c  it(&str);.  zSql
2080: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2090: 74 66 28 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b  tf(argv[2],argv[
20a0: 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  3]);.  rc = sqli
20b0: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
20c0: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
20d0: 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c 20  , &nRow, &nCol, 
20e0: 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  &zErr);.  sqlite
20f0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2100: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
2110: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2120: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2130: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66  erp, zBuf);.  if
2140: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2150: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
2160: 42 75 66 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29  Buf, "%d", nRow)
2170: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
2180: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2190: 7a 42 75 66 29 3b 0a 20 20 20 20 73 70 72 69 6e  zBuf);.    sprin
21a0: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e  tf(zBuf, "%d", n
21b0: 43 6f 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  Col);.    Tcl_Ap
21c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
21d0: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 66  rp, zBuf);.    f
21e0: 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 52 6f 77 2b  or(i=0; i<(nRow+
21f0: 31 29 2a 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  1)*nCol; i++){. 
2200: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45       Tcl_AppendE
2210: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 61  lement(interp, a
2220: 52 65 73 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73  Result[i] ? aRes
2230: 75 6c 74 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29  ult[i] : "NULL")
2240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2250: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  .    Tcl_AppendE
2260: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
2270: 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Err);.  }.  sqli
2280: 74 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61  te3_free_table(a
2290: 52 65 73 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a  Result);.  if( z
22a0: 45 72 72 20 29 20 66 72 65 65 28 7a 45 72 72 29  Err ) free(zErr)
22b0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
22c0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
22d0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73  ge:  sqlite3_las
22e0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44  t_insert_rowid D
22f0: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
2300: 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49  the integer ROWI
2310: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
2320: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a  cent insert..*/.
2330: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2340: 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f  last_rowid(.  vo
2350: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2360: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2370: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2380: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2390: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
23a0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
23b0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
23c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
23e0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
23f0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2400: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2410: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  /.){.  sqlite *d
2420: 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  b;.  char zBuf[3
2430: 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
2440: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
2450: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2460: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
2470: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
2480: 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22   argv[0], " DB\"
2490: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
24a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24b0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
24c0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
24d0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
24e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24f0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
2500: 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61  lld", sqlite3_la
2510: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
2520: 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  db));.  Tcl_Appe
2530: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2540: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
2550: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2560: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
2570: 73 71 6c 69 74 65 33 5f 6b 65 79 20 44 42 20 4b  sqlite3_key DB K
2580: 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  EY.**.** Set the
2590: 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73   codec key..*/.s
25a0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6b  tatic int test_k
25b0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
25c0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
25d0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25e0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25f0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2600: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2610: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2630: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2640: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
2650: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
2660: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
2670: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
2680: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 63 6f 6e  qlite *db;.  con
2690: 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
26a0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28   int nKey;.  if(
26b0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
26c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
26d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
26e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
26f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
2700: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
2710: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
2720: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2730: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2740: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2750: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2760: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2770: 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32  .  zKey = argv[2
2780: 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c  ];.  nKey = strl
2790: 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64 65 66  en(zKey);.#ifdef
27a0: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
27b0: 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28  C.  sqlite3_key(
27c0: 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, zKey, nKey);
27d0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
27e0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
27f0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
2800: 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a  3_rekey DB KEY.*
2810: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2820: 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74  codec key..*/.st
2830: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65  atic int test_re
2840: 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  key(.  void *Not
2850: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2860: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2870: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2880: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2890: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
28a0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28c0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
28d0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
28e0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
28f0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2900: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2910: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 63 6f  sqlite *db;.  co
2920: 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a  nst char *zKey;.
2930: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66    int nKey;.  if
2940: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
2950: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2960: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
2970: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2980: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
2990: 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41  .       " FILENA
29a0: 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ME\"", 0);.    r
29b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29c0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
29d0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
29e0: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
29f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a00: 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b  ;.  zKey = argv[
2a10: 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72  2];.  nKey = str
2a20: 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64 65  len(zKey);.#ifde
2a30: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2a40: 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  EC.  sqlite3_rek
2a50: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
2a60: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
2a70: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2a80: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
2a90: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
2aa0: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
2ab0: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
2ac0: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
2ad0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2ae0: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28  lite_test_close(
2af0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
2b00: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2b10: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2b20: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2b30: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2b40: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2b50: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
2b60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b70: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2b80: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
2b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2ba0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
2bb0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
2bc0: 74 65 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  te *db;.  int rc
2bd0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
2be0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2bf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2c00: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2c10: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2c20: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
2c30: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
2c40: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c50: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2c60: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2c70: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
2c80: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2c90: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
2ca0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
2cb0: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
2cc0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
2cd0: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  *)errorName(rc),
2ce0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
2cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2d00: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2d10: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f  tation of the x_
2d20: 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74  coalesce() funct
2d30: 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ion..** Return t
2d40: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
2d50: 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
2d60: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
2d70: 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28 73  oid ifnullFunc(s
2d80: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2d90: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
2da0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
2db0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20   **argv){.  int 
2dc0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
2dd0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
2de0: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21  if( SQLITE_NULL!
2df0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
2e00: 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a  ype(argv[i]) ){.
2e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2e20: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
2e30: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
2e40: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 20  _text(argv[i]), 
2e50: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51  -1,.          SQ
2e60: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2e70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2e80: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2e90: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
2ea0: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
2eb0: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
2ec0: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
2ed0: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
2ee0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
2ef0: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
2f00: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
2f10: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
2f20: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
2f30: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
2f40: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
2f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f60: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
2f70: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
2f80: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
2f90: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
2fa0: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69  = strlen(z);.  i
2fb0: 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20  f( p->nUsed + n 
2fc0: 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20  + 2 > p->nAlloc 
2fd0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  ){.    char *zNe
2fe0: 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  w;.    p->nAlloc
2ff0: 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b   = p->nAlloc*2 +
3000: 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e   n + 200;.    zN
3010: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
3020: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
3030: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  oc);.    if( zNe
3040: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
3050: 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a  liteFree(p->z);.
3060: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
3070: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
3080: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3090: 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a    }.    p->z = z
30a0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  New;.  }.  if( d
30b0: 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e 55 73  ivider && p->nUs
30c0: 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a  ed>0 ){.    p->z
30d0: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64  [p->nUsed++] = d
30e0: 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65  ivider;.  }.  me
30f0: 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55  mcpy(&p->z[p->nU
3100: 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20  sed], z, n+1);. 
3110: 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a   p->nUsed += n;.
3120: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64  }../*.** Invoked
3130: 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 62 61   for each callba
3140: 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45  ck from sqlite3E
3150: 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69  xecFunc.*/.stati
3160: 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63 43 61  c int execFuncCa
3170: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61  llback(void *pDa
3180: 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68  ta, int argc, ch
3190: 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20  ar **argv, char 
31a0: 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73 74  **NotUsed){.  st
31b0: 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d 20 28  ruct dstr *p = (
31c0: 73 74 72 75 63 74 20 64 73 74 72 2a 29 70 44 61  struct dstr*)pDa
31d0: 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  ta;.  int i;.  f
31e0: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
31f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72  i++){.    if( ar
3200: 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  gv[i]==0 ){.    
3210: 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20    dstrAppend(p, 
3220: 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20  "NULL", ' ');.  
3230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
3240: 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61 72 67  strAppend(p, arg
3250: 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20  v[i], ' ');.    
3260: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
3280: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3290: 20 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 28 29   x_sqlite_exec()
32a0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
32b0: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a   function takes.
32c0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75  ** a single argu
32d0: 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d 70 74  ment and attempt
32e0: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61  s to execute tha
32f0: 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20 53 51  t argument as SQ
3300: 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20  L code..** This 
3310: 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73  is illegal and s
3320: 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20 53 51  hould set the SQ
3330: 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c 61 67  LITE_MISUSE flag
3340: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
3350: 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e  ..**.** 2004-Jan
3360: 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20 63 68  -07:  We have ch
3370: 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20 6d 61  anged this to ma
3380: 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f 20 63  ke it legal to c
3390: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78 65 63  all sqlite3_exec
33a0: 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69  ().** from withi
33b0: 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  n a function cal
33c0: 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  l.  .** .** This
33d0: 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c 61 74   routine simulat
33e0: 65 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  es the effect of
33f0: 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68 72 65   having two thre
3400: 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a  ads attempt to.*
3410: 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64  * use the same d
3420: 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 73  atabase at the s
3430: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61  ame time..*/.sta
3440: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
3450: 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71 6c 69  ExecFunc(.  sqli
3460: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3470: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
3480: 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  c,  .  sqlite3_v
3490: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
34a0: 20 73 74 72 75 63 74 20 64 73 74 72 20 78 3b 0a   struct dstr x;.
34b0: 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20    memset(&x, 0, 
34c0: 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 73 71  sizeof(x));.  sq
34d0: 6c 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69  lite3_exec((sqli
34e0: 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  te*)sqlite3_user
34f0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a  _data(context),.
3500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
3510: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
3520: 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e  ),.      execFun
3530: 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30  cCallback, &x, 0
3540: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
3550: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
3560: 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20  , x.z, x.nUsed, 
3570: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
3580: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3590: 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  x.z);.}../*.** U
35a0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65  sage:  sqlite_te
35b0: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
35c0: 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  on DB.**.** Call
35d0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
35e0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49  ate_function API
35f0: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61   on the given da
3600: 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a  tabase in order.
3610: 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66  ** to create a f
3620: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78  unction named "x
3630: 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54 68 69  _coalesce".  Thi
3640: 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
3650: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a  the same thing.*
3660: 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c 65 73  * as the "coales
3670: 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ce" function.  T
3680: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  his function als
3690: 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e 20 53  o registers an S
36a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e  QL function.** n
36b0: 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65 5f 65  amed "x_sqlite_e
36c0: 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f 6b 65  xec" that invoke
36d0: 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  s sqlite3_exec()
36e0: 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69  .  Invoking sqli
36f0: 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e  te3_exec().** in
3700: 20 74 68 69 73 20 77 61 79 20 69 73 20 69 6c 6c   this way is ill
3710: 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e 20 61  egal recursion a
3720: 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73 65 20  nd should raise 
3730: 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  an SQLITE_MISUSE
3740: 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65   error..** The e
3750: 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c 61 72  ffect is similar
3760: 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20 75 73   to trying to us
3770: 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  e the same datab
3780: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
3790: 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61  rom.** two threa
37a0: 64 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ds at the same t
37b0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ime..**.** The o
37c0: 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69  riginal motivati
37d0: 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  on for this rout
37e0: 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62  ine was to be ab
37f0: 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a  le to call the.*
3800: 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
3810: 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69  _function functi
3820: 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79  on while a query
3830: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
3840: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74  in order.** to t
3850: 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  est the SQLITE_M
3860: 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20  ISUSE detection 
3870: 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
3880: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
3890: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
38a0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
38b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
38c0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
38d0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
38e0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
38f0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3900: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3920: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3930: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
3940: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
3950: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
3960: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  .){.  sqlite *db
3970: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
3980: 65 20 2a 70 56 61 6c 3b 0a 20 20 65 78 74 65 72  e *pVal;.  exter
3990: 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73  n void Md5_Regis
39a0: 74 65 72 28 73 71 6c 69 74 65 2a 29 3b 0a 0a 20  ter(sqlite*);.. 
39b0: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
39c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
39d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
39e0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
39f0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
3a00: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
3a10: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
3a20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
3a30: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
3a40: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
3a50: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
3a60: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3a70: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  ROR;.  sqlite3_c
3a80: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
3a90: 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c  b, "x_coalesce",
3aa0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c   -1, SQLITE_ANY,
3ab0: 20 30 2c 20 0a 20 20 20 20 20 20 69 66 6e 75 6c   0, .      ifnul
3ac0: 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20  lFunc, 0, 0);.. 
3ad0: 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69   /* Use the sqli
3ae0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
3af0: 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72 65  ion16() API here
3b00: 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75 6e  . Mainly for fun
3b10: 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a 2a  , but also .  **
3b20: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
3b30: 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68 65  ot tested anywhe
3b40: 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 70 56  re else. */.  pV
3b50: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
3b60: 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65  eNew();.  sqlite
3b70: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
3b80: 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65  l, -1, "x_sqlite
3b90: 5f 65 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55  _exec", SQLITE_U
3ba0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
3bb0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  IC);.  sqlite3_c
3bc0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
3bd0: 28 64 62 2c 20 73 71 6c 69 74 65 33 56 61 6c 75  (db, sqlite3Valu
3be0: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
3bf0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 2c  TE_UTF16NATIVE),
3c00: 0a 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45  .      1, SQLITE
3c10: 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71 6c 69  _UTF16, db, sqli
3c20: 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30 2c 20  te3ExecFunc, 0, 
3c30: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
3c40: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
3c50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3c60: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
3c70: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
3c80: 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72  e x_count() aggr
3c90: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  egate function..
3ca0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3cb0: 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e 74  t CountCtx Count
3cc0: 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75 6e  Ctx;.struct Coun
3cd0: 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  tCtx {.  int n;.
3ce0: 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  };.static void c
3cf0: 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65 33  ountStep(sqlite3
3d00: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3d10: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
3d20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3d30: 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a  v){.  CountCtx *
3d40: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
3d50: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
3d60: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
3d70: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28  of(*p));.  if( (
3d80: 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54  argc==0 || SQLIT
3d90: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
3da0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
3db0: 30 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20  0]) ) && p ){.  
3dc0: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20    p->n++;.  }.} 
3dd0: 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63    .static void c
3de0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ountFinalize(sql
3df0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3e00: 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43  ntext){.  CountC
3e10: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
3e20: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3e30: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
3e40: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73  sizeof(*p));.  s
3e50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
3e60: 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70  t(context, p ? p
3e70: 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ->n : 0);.}../*.
3e80: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
3e90: 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  e_test_create_ag
3ea0: 67 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a  gregate DB.**.**
3eb0: 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
3ec0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
3ed0: 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76  n API on the giv
3ee0: 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  en database in o
3ef0: 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74  rder.** to creat
3f00: 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  e a function nam
3f10: 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54  ed "x_count".  T
3f20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
3f30: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
3f40: 0a 2a 2a 20 61 73 20 74 68 65 20 22 6d 64 35 73  .** as the "md5s
3f50: 75 6d 22 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  um" function..**
3f60: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
3f70: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
3f80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
3f90: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
3fa0: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
3fb0: 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  e3_create_aggreg
3fc0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  ate function whi
3fd0: 6c 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e  le a query is in
3fe0: 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64   progress in ord
3ff0: 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68  er.** to test th
4000: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
4010: 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e  detection logic.
4020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
4030: 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65  est_create_aggre
4040: 67 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  gate(.  void *No
4050: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4060: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4070: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4080: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4090: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
40a0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
40d0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
40e0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
40f0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4100: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4110: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 69   sqlite *db;.  i
4120: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
4130: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4140: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4150: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4160: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4170: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
4180: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
4190: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
41a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
41b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
41c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
41d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
41e0: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  R;.  sqlite3_cre
41f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
4200: 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53   "x_count", 0, S
4210: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
4220: 2c 0a 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65  ,.      countSte
4230: 70 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29  p,countFinalize)
4240: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
4250: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
4260: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
4270: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
4280: 0a 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65 70  .      countStep
4290: 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b  ,countFinalize);
42a0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
42b0: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  ;.}..../*.** Usa
42c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
42d0: 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20  intf_int FORMAT 
42e0: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
42f0: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61  INTEGER.**.** Ca
4300: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
4310: 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61 72  three integer ar
4320: 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  guments.*/.stati
4330: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
4340: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
4350: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4360: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4370: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4380: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4390: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
43a0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
43b0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
43c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
43d0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
43e0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
43f0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4400: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4410: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
4420: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
4430: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
4440: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4450: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4460: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4470: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4480: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
4490: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
44a0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
44b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
44c0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
44d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
44e0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
44f0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
4500: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
4510: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
4520: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4530: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
4540: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
4550: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4560: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
4570: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
4590: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
45a0: 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20  zNum represents 
45b0: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
45c0: 77 69 6c 6c 20 66 69 74 20 69 6e 20 36 34 2d 62  will fit in 64-b
45d0: 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  its, then set.**
45e0: 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61 74   *pValue to that
45f0: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74   integer and ret
4600: 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65 72  urn true.  Other
4610: 77 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c 73  wise return fals
4620: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4630: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36 34   sqlite3GetInt64
4640: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75  (const char *zNu
4650: 6d 2c 20 69 36 34 20 2a 70 56 61 6c 75 65 29 7b  m, i64 *pValue){
4660: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
4670: 74 73 49 6e 36 34 42 69 74 73 28 7a 4e 75 6d 29  tsIn64Bits(zNum)
4680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 61   ){.    sqlite3a
4690: 74 6f 69 36 34 28 7a 4e 75 6d 2c 20 70 56 61 6c  toi64(zNum, pVal
46a0: 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ue);.    return 
46b0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
46c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  0;.}../*.** Usag
46d0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
46e0: 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41 54  ntf_int64 FORMAT
46f0: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
4700: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43   INTEGER.**.** C
4710: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
4720: 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69 6e   three 64-bit in
4730: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a  teger arguments.
4740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4750: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
4760: 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  t64(.  void *Not
4770: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
4780: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
4790: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
47a0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
47b0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
47c0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
47e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
47f0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4800: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4810: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4820: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4830: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f  int i;.  sqlite_
4840: 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63 68  int64 a[3];.  ch
4850: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
4860: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
4870: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4880: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4890: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
48a0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
48b0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
48c0: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
48d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
48e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
48f0: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
4900: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
4910: 47 65 74 49 6e 74 36 34 28 61 72 67 76 5b 69 5d  GetInt64(argv[i]
4920: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a 20 20  , &a[i-2]) ){.  
4930: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4940: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 72  sult(interp, "ar
4950: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20  gument is not a 
4960: 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e 74  valid 64-bit int
4970: 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20  eger", 0);.     
4980: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4990: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  R;.    }.  }.  z
49a0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
49b0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
49c0: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
49d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
49e0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
49f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4a00: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
4a10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4a20: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
4a30: 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54  rintf_str FORMAT
4a40: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
4a50: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61   STRING.**.** Ca
4a60: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
4a70: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
4a80: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74  ments and one st
4a90: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  ring argument.*/
4aa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4ab0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28  te3_mprintf_str(
4ac0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4ad0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4ae0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4af0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4b00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4b10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4b20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4b50: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4b70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4b80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
4b90: 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20  a[3], i;.  char 
4ba0: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34  *z;.  if( argc<4
4bb0: 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20   || argc>5 ){.  
4bc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4bd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4be0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4bf0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4c00: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
4c10: 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e  T INT INT ?STRIN
4c20: 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  G?\"", 0);.    r
4c30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4c40: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
4c50: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
4c60: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
4c70: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
4c80: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
4c90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4ca0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
4cb0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
4cc0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
4cd0: 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55  4 ? argv[4] : NU
4ce0: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
4cf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4d00: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
4d10: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
4d20: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
4d30: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
4d40: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
4d50: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
4d60: 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a  NTEGER DOUBLE.**
4d70: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
4d80: 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65   with two intege
4d90: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  r arguments and 
4da0: 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  one double argum
4db0: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
4dc0: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
4dd0: 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  f_double(.  void
4de0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
4df0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4e00: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
4e10: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
4e20: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4e30: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4e40: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4e50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4e60: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4e70: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4e80: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4e90: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4ea0: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
4eb0: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20  ;.  double r;.  
4ec0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
4ed0: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
4ee0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4ef0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4f00: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4f10: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4f20: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
4f30: 54 20 49 4e 54 20 53 54 52 49 4e 47 5c 22 22 2c  T INT STRING\"",
4f40: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4f50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4f60: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
4f70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
4f80: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
4f90: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
4fa0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4fb0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4fc0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e  Tcl_GetDouble(in
4fd0: 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26  terp, argv[4], &
4fe0: 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  r) ) return TCL_
4ff0: 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c  ERROR;.  z = sql
5000: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
5010: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
5020: 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  , r);.  Tcl_Appe
5030: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5040: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
5050: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
5060: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
5070: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
5080: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
5090: 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44   FORMAT DOUBLE D
50a0: 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  OUBLE.**.** Call
50b0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
50c0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
50d0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
50e0: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
50f0: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
5100: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
5110: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
5120: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
5130: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
5140: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
5150: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
5160: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
5170: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
5180: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
5190: 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76  intf_scaled(.  v
51a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
51b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
51c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
51d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
51e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
51f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
5200: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
5210: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5220: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5230: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
5240: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
5250: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
5260: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
5270: 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20   double r[2];.  
5280: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
5290: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  rgc!=4 ){.    Tc
52a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
52b0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
52c0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
52d0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
52e0: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f       " FORMAT DO
52f0: 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20  UBLE DOUBLE\"", 
5300: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5310: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5320: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
5330: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
5340: 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70  GetDouble(interp
5350: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d  , argv[i], &r[i-
5360: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
5370: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
5380: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5390: 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a  f(argv[1], r[0]*
53a0: 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  r[1]);.  Tcl_App
53b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
53c0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
53d0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
53e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
53f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5400: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
5410: 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52  ronly FORMAT STR
5420: 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  ING.**.** Call m
5430: 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69  printf with a si
5440: 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75  ngle double argu
5450: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68  ment which is th
5460: 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  e product of the
5470: 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  .** two argument
5480: 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20  s given above.  
5490: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
54a0: 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f  generate overflo
54b0: 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a  w and underflow.
54c0: 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65  ** doubles to te
54d0: 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  st that they are
54e0: 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65   converted prope
54f0: 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rly..*/.static i
5500: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
5510: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
5520: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
5530: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5540: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
5550: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
5560: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
5570: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
5580: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
5590: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
55a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
55b0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
55c0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
55d0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
55e0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
55f0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
5600: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
5610: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
5620: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
5630: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
5640: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
5650: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
5660: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5670: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5680: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5690: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
56a0: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
56b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
56c0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
56d0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
56e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
56f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
5700: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20  ite_malloc_fail 
5710: 4e 0a 2a 2a 0a 2a 2a 20 52 69 67 20 73 71 6c 69  N.**.** Rig sqli
5720: 74 65 4d 61 6c 6c 6f 63 28 29 20 74 6f 20 66 61  teMalloc() to fa
5730: 69 6c 20 6f 6e 20 74 68 65 20 4e 2d 74 68 20 63  il on the N-th c
5740: 61 6c 6c 2e 20 20 54 75 72 6e 20 6f 66 66 20 74  all.  Turn off t
5750: 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  his mechanism.**
5760: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 73   and reset the s
5770: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
5780: 69 6c 65 64 20 76 61 72 69 61 62 6c 65 20 69 73  iled variable is
5790: 20 4e 3d 3d 30 2e 0a 2a 2f 0a 23 69 66 64 65 66   N==0..*/.#ifdef
57a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
57b0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
57c0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 28 0a 20 20 76  malloc_fail(.  v
57d0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
57e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
57f0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
5800: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
5810: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
5820: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
5830: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
5840: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5850: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5860: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
5870: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
5880: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
5890: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
58a0: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
58b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
58c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
58d0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
58e0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
58f0: 30 5d 2c 20 22 20 4e 5c 22 22 2c 20 30 29 3b 0a  0], " N\"", 0);.
5900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5910: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
5920: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
5930: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20  p, argv[1], &n) 
5940: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
5950: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 4d  OR;.  sqlite3_iM
5960: 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6e 3b 0a 20  allocFail = n;. 
5970: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
5980: 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 72 65  failed = 0;.  re
5990: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
59a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
59b0: 67 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  ge: sqlite_mallo
59c0: 63 5f 73 74 61 74 0a 2a 2a 0a 2a 2a 20 52 65 74  c_stat.**.** Ret
59d0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
59e0: 66 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  f prior calls to
59f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
5a00: 61 6e 64 20 73 71 6c 69 74 65 46 72 65 65 28 29  and sqliteFree()
5a10: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5a20: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
5a30: 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  int sqlite_mallo
5a40: 63 5f 73 74 61 74 28 0a 20 20 76 6f 69 64 20 2a  c_stat(.  void *
5a50: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
5a60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
5a70: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
5a80: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
5a90: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
5aa0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
5ab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5ac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
5ad0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
5ae0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
5af0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
5b00: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
5b10: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30  .  char zBuf[200
5b20: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
5b30: 66 2c 20 22 25 64 20 25 64 20 25 64 22 2c 20 73  f, "%d %d %d", s
5b40: 71 6c 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2c 20  qlite3_nMalloc, 
5b50: 73 71 6c 69 74 65 33 5f 6e 46 72 65 65 2c 20 73  sqlite3_nFree, s
5b60: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
5b70: 69 6c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  il);.  Tcl_Appen
5b80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5b90: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
5ba0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
5bb0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
5bc0: 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a  :  sqlite_abort.
5bd0: 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  **.** Shutdown t
5be0: 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64  he process immed
5bf0: 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73  iately.  This is
5c00: 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75   not a clean shu
5c10: 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63  tdown..** This c
5c20: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
5c30: 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76  o test the recov
5c40: 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64  erability of a d
5c50: 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68  atabase in.** th
5c60: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f  e event of a pro
5c70: 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73  gram crash..*/.s
5c80: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
5c90: 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a  _abort(.  void *
5ca0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
5cb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
5cc0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
5cd0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
5ce0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
5cf0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
5d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5d10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
5d20: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
5d30: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
5d40: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
5d50: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
5d60: 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65 72  .  assert( inter
5d70: 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69  p==0 );   /* Thi
5d80: 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  s will always fa
5d90: 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  il */.  return T
5da0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
5db0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
5dc0: 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d  utine is a user-
5dd0: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
5de0: 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f  tion whose purpo
5df0: 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74  se.** is to test
5e00: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f   the sqlite_set_
5e10: 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f  result() API..*/
5e20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
5e30: 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  tFunc(sqlite3_co
5e40: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
5e50: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
5e60: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
5e70: 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d  .  while( argc>=
5e80: 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  2 ){.    const c
5e90: 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 73 71 6c  har *zArg0 = sql
5ea0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5eb0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
5ec0: 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20  ( zArg0 ){.     
5ed0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
5ee0: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69  trICmp(zArg0, "i
5ef0: 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nt") ){.        
5f00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
5f10: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  nt(context, sqli
5f20: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
5f30: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
5f40: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
5f50: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69  StrICmp(zArg0,"i
5f60: 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nt64")==0 ){.   
5f70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5f80: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
5f90: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
5fa0: 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29  _int64(argv[1]))
5fb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5fc0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5fd0: 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29  (zArg0,"string")
5fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
5ff0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6000: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
6010: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6020: 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20  rgv[1]), -1,.   
6030: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6040: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
6050: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
6060: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
6070: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
6080: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6090: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
60a0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
60b0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
60c0: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
60d0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
60e0: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75  trICmp(zArg0,"nu
60f0: 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
6100: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6110: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
6120: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6130: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6140: 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d  zArg0,"value")==
6150: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
6160: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
6170: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
6180: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
6190: 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20  t(argv[1])]);.  
61a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61b0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
61c0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
61d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f  else{.      goto
61e0: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
61f0: 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b  }.    argc -= 2;
6200: 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a  .    argv += 2;.
6210: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65    }.  return;..e
6220: 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
6230: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6240: 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20  (context,"first 
6250: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
6260: 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20  be one of: ".   
6270: 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74     "int int64 st
6280: 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c  ring double null
6290: 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a   value", -1);.}.
62a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
62b0: 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f  sqlite_register_
62c0: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44  test_function  D
62d0: 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  B  NAME.**.** Re
62e0: 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20  gister the test 
62f0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  SQL function on 
6300: 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20  the database DB 
6310: 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e  under the name N
6320: 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  AME..*/.static i
6330: 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72  nt test_register
6340: 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _func(.  void *N
6350: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
6360: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
6370: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
6380: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
6390: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
63a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63c0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
63d0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
63e0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
63f0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
6400: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
6410: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
6420: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
6430: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
6440: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6450: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
6460: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
6470: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
6480: 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49       " DB FUNCTI
6490: 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20  ON-NAME", 0);.  
64a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
64b0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
64c0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
64d0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
64e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
64f0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
6500: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6510: 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
6520: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
6530: 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
6540: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
6550: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
6560: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6570: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
6580: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
6590: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
65a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
65b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
65c0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
65d0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54  te3_finalize  ST
65e0: 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69  MT .**.** Finali
65f0: 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68  ze a statement h
6600: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
6610: 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69   int test_finali
6620: 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ze(.  void * cli
6630: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
6640: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
6650: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
6660: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
6670: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
6680: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
6690: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
66a0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
66b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
66c0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
66d0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
66e0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
66f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
6700: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
6710: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
6720: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6730: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
6740: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
6750: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
6760: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
6770: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
6780: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
6790: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
67a0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  e(pStmt);.  Tcl_
67b0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
67c0: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
67d0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
67e0: 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
67f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
6800: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
6810: 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a  reset  STMT .**.
6820: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74  ** Finalize a st
6830: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
6840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
6850: 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64  st_reset(.  void
6860: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
6870: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6880: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
6890: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
68a0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
68b0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
68c0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
68d0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
68e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
68f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
6900: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
6910: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
6920: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
6930: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
6940: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
6950: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6960: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
6970: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
6980: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
6990: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
69a0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
69b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
69c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
69d0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  eset(pStmt);.  i
69e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
69f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6a00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
6a10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
6a20: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  ge:  sqlite3_cha
6a30: 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  nges DB.**.** Re
6a40: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
6a50: 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  of changes made 
6a60: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
6a70: 62 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a  by the last SQL.
6a80: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f  ** execution..*/
6a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
6aa0: 5f 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64  _changes(.  void
6ab0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
6ac0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6ad0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
6ae0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
6af0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
6b00: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
6b10: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
6b20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6b30: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6b40: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
6b50: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63  e \"",.       Tc
6b60: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
6b70: 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
6b80: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6b90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
6ba0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
6bb0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
6bc0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
6bd0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
6be0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
6bf0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
6c00: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
6c10: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
6c20: 64 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  db)));.  return 
6c30: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
6c40: 20 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74   This is the "st
6c50: 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22  atic_bind_value"
6c60: 20 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20   that variables 
6c70: 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65  are bound to whe
6c80: 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70  n.** the FLAG op
6c90: 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f  tion of sqlite3_
6ca0: 62 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22  bind is "static"
6cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
6cc0: 2a 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  *sqlite_static_b
6cd0: 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 0a  ind_value = 0;..
6ce0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
6cf0: 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20  lite3_bind  VM  
6d00: 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47  IDX  VALUE  FLAG
6d10: 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65  S.**.** Sets the
6d20: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44   value of the ID
6d30: 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65 20 6f  X-th occurance o
6d40: 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69  f "?" in the ori
6d50: 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72  ginal SQL.** str
6d60: 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74  ing.  VALUE is t
6d70: 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49  he new value.  I
6d80: 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20  f FLAGS=="null" 
6d90: 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a  then VALUE is.**
6da0: 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65   ignored and the
6db0: 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f   value is set to
6dc0: 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53   NULL.  If FLAGS
6dd0: 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a  =="static" then.
6de0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  ** the value is 
6df0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6e00: 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61 72   of a static var
6e10: 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22  iable named.** "
6e20: 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
6e30: 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46  nd_value".  If F
6e40: 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74  LAGS=="normal" t
6e50: 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  hen a copy.** of
6e60: 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61   the VALUE is ma
6e70: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
6e80: 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76  t test_bind(.  v
6e90: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6ea0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6eb0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
6ec0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
6ed0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
6ee0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
6ef0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
6f00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6f10: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6f20: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
6f30: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
6f40: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6f50: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
6f60: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
6f70: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
6f80: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
6f90: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
6fa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6fb0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
6fc0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
6fd0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
6fe0: 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e   VM IDX VALUE (n
6ff0: 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61  ull|static|norma
7000: 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  l)\"", 0);.    r
7010: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7020: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
7030: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
7040: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d  , argv[1], &pStm
7050: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
7060: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
7070: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
7080: 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  argv[2], &idx) )
7090: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
70a0: 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  R;.  if( strcmp(
70b0: 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d  argv[4],"null")=
70c0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
70d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
70e0: 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20  (pStmt, idx);.  
70f0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
7100: 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63  (argv[4],"static
7110: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
7120: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
7130: 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
7140: 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
7150: 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29  nd_value, -1, 0)
7160: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
7170: 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f  rcmp(argv[4],"no
7180: 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rmal")==0 ){.   
7190: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
71a0: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
71b0: 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c  dx, argv[3], -1,
71c0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
71d0: 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
71e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
71f0: 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61  t(interp, "4th a
7200: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
7210: 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e  e ".        "\"n
7220: 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69  ull\" or \"stati
7230: 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c  c\" or \"normal\
7240: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
7250: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7260: 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
7270: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
7280: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
7290: 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
72a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
72b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
72c0: 75 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  uf, sqlite3ErrSt
72d0: 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  r(rc), 0);.    r
72e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
72f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
7300: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
7310: 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
7320: 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e  collate <db ptr>
7330: 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
7340: 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a  > <utf16be>.**.*
7350: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7360: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
7370: 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65  that SQLite sele
7380: 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  cts the correct 
7390: 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71  collation.** seq
73a0: 75 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77  uence callback w
73b0: 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72  hen multiple ver
73c0: 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65  sions (for diffe
73d0: 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69  rent text encodi
73e0: 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69  ngs).** are avai
73f0: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c  lable..**.** Cal
7400: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
7410: 65 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20  e registers the 
7420: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7430: 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  ce "test_collate
7440: 22 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61  ".** with databa
7450: 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20  se handle <db>. 
7460: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
7470: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69  ent must be a li
7480: 73 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62  st of three.** b
7490: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49  oolean values. I
74a0: 66 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74  f the first is t
74b0: 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73  rue, then a vers
74c0: 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ion of test_coll
74d0: 61 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74  ate is.** regist
74e0: 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20  ered for UTF-8, 
74f0: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  if the second is
7500: 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e   true, a version
7510: 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66   is registered f
7520: 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20  or.** UTF-16le, 
7530: 69 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20  if the third is 
7540: 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65  true, a UTF-16be
7550: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
7560: 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f  lable..** Previo
7570: 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  us versions of t
7580: 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20  est_collate are 
7590: 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
75a0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
75b0: 75 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61  uence test_colla
75c0: 74 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  te is implemente
75d0: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  d by calling the
75e0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43  .** following TC
75f0: 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20  L script:.**.** 
7600: 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20    "test_collate 
7610: 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73  <enc> <lhs> <rhs
7620: 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68  >".**.** The <lh
7630: 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65  s> and <rhs> are
7640: 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20   the two values 
7650: 62 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20  being compared, 
7660: 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38  encoded in UTF-8
7670: 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70  ..** The <enc> p
7680: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
7690: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
76a0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
76b0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74  on that.** SQLit
76c0: 65 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61  e selected to ca
76d0: 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74  ll. The TCL test
76e0: 20 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e   script implemen
76f0: 74 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f  ts the.** "test_
7700: 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a  collate" proc..*
7710: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
7720: 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f  his will only wo
7730: 72 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65  rk with one inte
7740: 70 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65  preter at a time
7750: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65  , as the.** inte
7760: 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73  rp pointer to us
7770: 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e  e when evaluatin
7780: 67 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74  g the TCL script
7790: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
77a0: 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
77b0: 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  erp..*/.static T
77c0: 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74  cl_Interp* pTest
77d0: 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73  CollateInterp;.s
77e0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
77f0: 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76  ollate_func(.  v
7800: 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  oid *pCtx, .  in
7810: 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t nA, const void
7820: 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20   *zA,.  int nB, 
7830: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
7840: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
7850: 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  i = pTestCollate
7860: 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e  Interp;.  int en
7870: 63 69 6e 20 3d 20 28 69 6e 74 29 70 43 74 78 3b  cin = (int)pCtx;
7880: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 73  .  int res;..  s
7890: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
78a0: 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  al;.  Tcl_Obj *p
78b0: 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  X;..  pX = Tcl_N
78c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
78d0: 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b  t_collate", -1);
78e0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
78f0: 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74  unt(pX);..  swit
7900: 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20  ch( encin ){.   
7910: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
7920: 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  8:.      Tcl_Lis
7930: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
7940: 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
7950: 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
7960: 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
7970: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7980: 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20  TE_UTF16LE:.    
7990: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
79a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
79b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
79c0: 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29  ("UTF-16LE",-1))
79d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
79e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
79f0: 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63  TF16BE:.      Tc
7a00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7a10: 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
7a20: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
7a30: 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20  F-16BE",-1));.  
7a40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
7a50: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
7a60: 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  sert(0);.  }..  
7a70: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
7a80: 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69  lueNew();.  sqli
7a90: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
7aa0: 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63  Val, nA, zA, enc
7ab0: 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  in, SQLITE_STATI
7ac0: 43 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  C);.  Tcl_ListOb
7ad0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
7ae0: 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
7af0: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  gObj(sqlite3_val
7b00: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31  ue_text(pVal),-1
7b10: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  ));.  sqlite3Val
7b20: 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e  ueSetStr(pVal, n
7b30: 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51  B, zB, encin, SQ
7b40: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7b50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
7b60: 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
7b70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
7b80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
7b90: 74 28 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20 20  t(pVal),-1));.  
7ba0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7bb0: 28 70 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45  (pVal);..  Tcl_E
7bc0: 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20  valObjEx(i, pX, 
7bd0: 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
7be0: 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
7bf0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
7c00: 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  i, Tcl_GetObjRes
7c10: 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20  ult(i), &res);. 
7c20: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73   return res;.}.s
7c30: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
7c40: 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
7c50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
7c60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7c70: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
7c80: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
7c90: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
7ca0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76  te3 *db;.  int v
7cb0: 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al;.  sqlite3_va
7cc0: 6c 75 65 20 2a 70 56 61 6c 3b 0a 0a 20 20 69 66  lue *pVal;..  if
7cd0: 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f  ( objc!=5 ) goto
7ce0: 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65   bad_args;.  pTe
7cf0: 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20  stCollateInterp 
7d00: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20  = interp;.  if( 
7d10: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
7d20: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
7d30: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
7d40: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7d50: 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c  RROR;..  if( TCL
7d60: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
7d70: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7d80: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
7d90: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7da0: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
7db0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
7dc0: 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
7dd0: 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  te", SQLITE_UTF8
7de0: 2c 20 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64  , .        (void
7df0: 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20   *)SQLITE_UTF8, 
7e00: 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
7e10: 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20  _func:0);.  if( 
7e20: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
7e30: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
7e40: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
7e50: 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
7e60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
7e70: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
7e80: 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f  ion(db, "test_co
7e90: 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
7ea0: 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20  TF16LE, .       
7eb0: 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
7ec0: 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73  UTF16LE, val?tes
7ed0: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
7ee0: 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  );.  if( TCL_OK!
7ef0: 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
7f00: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
7f10: 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[4], &val) ) 
7f20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7f30: 3b 0a 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  ;..  pVal = sqli
7f40: 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
7f50: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
7f60: 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74  Str(pVal, -1, "t
7f70: 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
7f80: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
7f90: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
7fa0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
7fb0: 61 74 69 6f 6e 31 36 28 64 62 2c 20 73 71 6c 69  ation16(db, sqli
7fc0: 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
7fd0: 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  l, SQLITE_UTF16N
7fe0: 41 54 49 56 45 29 2c 20 0a 20 20 20 20 20 20 20  ATIVE), .       
7ff0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
8000: 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
8010: 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73  UTF16BE, val?tes
8020: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
8030: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
8040: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 0a  eFree(pVal);.  .
8050: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8060: 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63  ..bad_args:.  Tc
8070: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8080: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8090: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
80a0: 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47  \"",.      Tcl_G
80b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
80c0: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
80d0: 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  DB> <utf8> <utf1
80e0: 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c  6le> <utf16be>",
80f0: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
8100: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74  L_ERROR;.}..stat
8110: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c  ic void test_col
8120: 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a  late_needed_cb(.
8130: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
8140: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
8150: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
8160: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 6e 6f 74 55  const void *notU
8170: 73 65 64 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63  sed.){.  int enc
8180: 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 73 71   = db->enc;.  sq
8190: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
81a0: 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  lation(.      db
81b0: 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
81c0: 2c 20 64 62 2d 3e 65 6e 63 2c 20 28 76 6f 69 64  , db->enc, (void
81d0: 20 2a 29 65 6e 63 2c 20 74 65 73 74 5f 63 6f 6c   *)enc, test_col
81e0: 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f  late_func);.}../
81f0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f  *.** Usage: add_
8200: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
8210: 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ded DB.*/.static
8220: 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74   int test_collat
8230: 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  e_needed(.  void
8240: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
8250: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8260: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
8270: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
8280: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
8290: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
82a0: 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f  ( objc!=2 ) goto
82b0: 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28   bad_args;.  if(
82c0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
82d0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
82e0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
82f0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
8300: 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
8310: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
8320: 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f  d16(db, 0, test_
8330: 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
8340: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  b);.  return TCL
8350: 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
8360: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
8370: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
8380: 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74  jv, "DB");.  ret
8390: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
83a0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
83b0: 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  dd_test_function
83c0: 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e   <db ptr> <utf8>
83d0: 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
83e0: 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  6be>.**.** This 
83f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
8400: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
8410: 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65  Lite selects the
8420: 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a   correct user.**
8430: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61   function callba
8440: 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
8450: 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
8460: 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
8470: 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
8480: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
8490: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
84a0: 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
84b0: 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73  up to three vers
84c0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72  ions of the user
84d0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65   function.** "te
84e0: 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74  st_function" wit
84f0: 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
8500: 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20  e <db>.  If the 
8510: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
8520: 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e  is.** true, then
8530: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65   a version of te
8540: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  st_function is r
8550: 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54  egistered for UT
8560: 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74  F-8, if the.** t
8570: 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
8580: 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73  version is regis
8590: 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36  tered for UTF-16
85a0: 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74  le, if the fourt
85b0: 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20  h is.** true, a 
85c0: 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
85d0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
85e0: 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
85f0: 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e  s of.** test_fun
8600: 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65  ction are delete
8610: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65  d..**.** The use
8620: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  r function is im
8630: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
8640: 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ling the followi
8650: 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a  ng TCL script:.*
8660: 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e  *.**   "test_fun
8670: 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67  ction <enc> <arg
8680: 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c  >".**.** Where <
8690: 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  enc> is one of U
86a0: 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f  TF-8, UTF-16LE o
86b0: 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c  r UTF16BE, and <
86c0: 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73  arg> is the.** s
86d0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70  ingle argument p
86e0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c  assed to the SQL
86f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76   function. The v
8700: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
8710: 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69  .** the TCL scri
8720: 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68  pt is used as th
8730: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
8740: 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  f the SQL functi
8750: 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73  on. It.** is pas
8760: 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73  sed to SQLite us
8770: 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72  ing UTF-16BE for
8780: 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75   a UTF-8 test_fu
8790: 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a  nction(), UTF-8.
87a0: 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c  ** for a UTF-16L
87b0: 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  E test_function(
87c0: 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20  ), and UTF-16LE 
87d0: 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  for an implement
87e0: 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72  ation that.** pr
87f0: 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a  efers UTF-16BE..
8800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
8810: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
8820: 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  8(.  sqlite3_con
8830: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
8840: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
8850: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
8860: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
8870: 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
8880: 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
8890: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
88a0: 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
88b0: 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
88c0: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
88d0: 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
88e0: 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
88f0: 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
8900: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
8910: 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
8920: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8930: 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
8940: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
8950: 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20  UTF-8", -1));.  
8960: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8970: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8980: 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
8990: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
89a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
89b0: 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
89c0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
89d0: 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
89e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
89f0: 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65  nt(pX);.  sqlite
8a00: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
8a10: 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  tx, Tcl_GetStrin
8a20: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
8a30: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
8a40: 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d  SIENT);.  pVal =
8a50: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
8a60: 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  ();.  sqlite3Val
8a70: 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
8a80: 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  1, Tcl_GetString
8a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
8aa0: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
8ab0: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
8ac0: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  C);.  sqlite3_re
8ad0: 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43  sult_text16be(pC
8ae0: 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  tx, sqlite3_valu
8af0: 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c 29  e_text16be(pVal)
8b00: 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49  ,.      -1, SQLI
8b10: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8b20: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
8b30: 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69  e(pVal);.}.stati
8b40: 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63  c void test_func
8b50: 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20 20  tion_utf16le(.  
8b60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8b70: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
8b80: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
8b90: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8ba0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8bb0: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
8bc0: 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
8bd0: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
8be0: 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
8bf0: 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
8c00: 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
8c10: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
8c20: 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
8c30: 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
8c40: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
8c50: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
8c60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8c70: 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
8c80: 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
8c90: 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  6LE", -1));.  Tc
8ca0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8cb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
8cc0: 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65  X, .      Tcl_Ne
8cd0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
8ce0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8cf0: 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
8d00: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
8d10: 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
8d20: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
8d30: 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
8d40: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
8d50: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
8d60: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
8d70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
8d80: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
8d90: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
8da0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8db0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
8dc0: 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 73 71 6c  lt_text(pCtx,sql
8dd0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8de0: 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f  pVal),-1,SQLITE_
8df0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
8e00: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
8e10: 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
8e20: 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
8e30: 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71 6c  n_utf16be(.  sql
8e40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
8e50: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
8e60: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8e70: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
8e80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
8e90: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
8ea0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8eb0: 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
8ec0: 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
8ed0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
8ee0: 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
8ef0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8f00: 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
8f10: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
8f20: 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
8f30: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8f40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8f50: 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
8f60: 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
8f70: 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
8f80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8f90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
8fa0: 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
8fb0: 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
8fc0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8fd0: 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
8fe0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
8ff0: 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
9000: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
9010: 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
9020: 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
9030: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
9040: 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
9050: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
9060: 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
9070: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
9080: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
9090: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
90a0: 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73  text16le(pCtx, s
90b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
90c0: 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
90d0: 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
90e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
90f0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
9100: 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  l);.}.static int
9110: 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a   test_function(.
9120: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
9130: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
9140: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
9150: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
9160: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
9170: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
9180: 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69  .  int val;..  i
9190: 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
91a0: 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
91b0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
91c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
91d0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
91e0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
91f0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
9200: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
9210: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
9220: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
9230: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
9240: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
9250: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
9260: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
9270: 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
9280: 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
9290: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69  UTF8, .        i
92a0: 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
92b0: 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29  tion_utf8, 0, 0)
92c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
92d0: 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
92e0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
92f0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
9300: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9310: 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
9320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
9330: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
9340: 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
9350: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
9360: 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16LE, .        i
9370: 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
9380: 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c  tion_utf16le, 0,
9390: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
93a0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
93b0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
93c0: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
93d0: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
93e0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
93f0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
9400: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
9410: 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
9420: 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
9430: 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
9440: 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
9450: 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c  unction_utf16be,
9460: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
9470: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61  eturn TCL_OK;.ba
9480: 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
9490: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
94a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
94b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
94c0: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
94d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
94e0: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
94f0: 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
9500: 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
9510: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
9520: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
9530: 61 67 65 3a 20 20 20 20 20 20 20 20 20 74 65 73  age:         tes
9540: 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f  t_errstr <err co
9550: 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  de>.**.** Test t
9560: 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20  hat the english 
9570: 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20  language string 
9580: 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20  equivalents for 
9590: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
95a0: 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20  es.** are sane. 
95b0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  The parameter is
95c0: 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   an integer repr
95d0: 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69  esenting an sqli
95e0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
95f0: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
9600: 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c  a list of two el
9610: 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69  ements, the stri
9620: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
9630: 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f  n of the.** erro
9640: 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65  r code and the e
9650: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
9660: 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  explanation..*/.
9670: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
9680: 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  errstr(.  void *
9690: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
96a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
96b0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
96c0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
96d0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
96e0: 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69   *zCode;.  int i
96f0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
9700: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
9710: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9720: 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72  1, objv, "<error
9730: 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20   code>");.  }.. 
9740: 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74   zCode = Tcl_Get
9750: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
9760: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30  .  for(i=0; i<20
9770: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
9780: 20 30 3d 3d 73 74 72 63 6d 70 28 65 72 72 6f 72   0==strcmp(error
9790: 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20  Name(i), zCode) 
97a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ) break;.  }.  T
97b0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
97c0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
97d0: 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30  ite3ErrStr(i), 0
97e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
97f0: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
9800: 74 20 73 71 6c 69 74 65 33 5f 63 72 61 73 68 70  t sqlite3_crashp
9810: 61 72 61 6d 73 28 0a 20 20 76 6f 69 64 20 2a 20  arams(.  void * 
9820: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
9830: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9840: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
9850: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
9860: 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64 65 66 20  bjv[].){.#ifdef 
9870: 4f 53 5f 54 45 53 54 0a 20 20 69 6e 74 20 64 65  OS_TEST.  int de
9880: 6c 61 79 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  lay;.  if( objc!
9890: 3d 33 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =3 ) goto bad_ar
98a0: 67 73 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  gs;.  if( Tcl_Ge
98b0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
98c0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 64 65  rp, objv[1], &de
98d0: 6c 61 79 29 20 29 20 72 65 74 75 72 6e 20 54 43  lay) ) return TC
98e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
98f0: 65 33 53 65 74 43 72 61 73 68 50 61 72 61 6d 73  e3SetCrashParams
9900: 28 64 65 6c 61 79 2c 20 54 63 6c 5f 47 65 74 53  (delay, Tcl_GetS
9910: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b  tring(objv[2]));
9920: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
9930: 20 54 43 4c 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66   TCL_OK;..#ifdef
9940: 20 4f 53 5f 54 45 53 54 0a 62 61 64 5f 61 72 67   OS_TEST.bad_arg
9950: 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
9960: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9970: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9980: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
9990: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
99a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
99b0: 30 29 2c 20 22 3c 64 65 6c 61 79 3e 20 3c 66 69  0), "<delay> <fi
99c0: 6c 65 6e 61 6d 65 3e 22 2c 20 30 29 3b 0a 20 20  lename>", 0);.  
99d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
99e0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
99f0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65  ** Usage:    bre
9a00: 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
9a10: 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74  is routine exist
9a20: 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73  s for one purpos
9a30: 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61  e - to provide a
9a40: 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a   place to put a.
9a50: 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69  ** breakpoint wi
9a60: 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20  th GDB that can 
9a70: 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69  be triggered usi
9a80: 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68  ng TCL code.  Th
9a90: 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69  e use.** for thi
9aa0: 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74  s is when a part
9ab0: 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c  icular test fail
9ac0: 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31  s on (say) the 1
9ad0: 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e  485th iteration.
9ae0: 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74  .** In the TCL t
9af0: 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63  est script, we c
9b00: 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65  an add code like
9b10: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
9b20: 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62   if {$i==1485} b
9b30: 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20  reakpoint.**.** 
9b40: 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78  Then run testfix
9b50: 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75  ture in the debu
9b60: 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f  gger and wait fo
9b70: 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74  r the breakpoint
9b80: 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68   to.** fire.  Th
9b90: 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72  en additional br
9ba0: 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65  eakpoints can be
9bb0: 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f   set to trace do
9bc0: 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73  wn the bug..*/.s
9bd0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
9be0: 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69  reakpoint(.  voi
9bf0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9c00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9c10: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9c20: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9c30: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9c40: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9c50: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9c60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9c70: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9c80: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9c90: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9ca0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9cb0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .){.  return TCL
9cc0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
9cd0: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a  Do nothing */.}.
9ce0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
9cf0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9d00: 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
9d10: 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
9d20: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69  lite3_bind_int i
9d30: 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
9d40: 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
9d50: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
9d60: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
9d70: 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
9d80: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
9d90: 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
9da0: 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d  d.** binds a 32-
9db0: 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55  bit integer VALU
9dc0: 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61  E to that wildca
9dd0: 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
9de0: 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28  t test_bind_int(
9df0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
9e00: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
9e10: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
9e20: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
9e30: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
9e40: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
9e50: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
9e60: 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65  idx;.  int value
9e70: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
9e80: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
9e90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9ea0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
9eb0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
9ec0: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
9ed0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9ee0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
9ef0: 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
9f00: 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
9f10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9f20: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
9f30: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
9f40: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
9f50: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
9f60: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9f70: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
9f80: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
9f90: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
9fa0: 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
9fb0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
9fc0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
9fd0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
9fe0: 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
9ff0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
a000: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
a010: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  _int(pStmt, idx,
a020: 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 72   value);.  if( r
a030: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a040: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a050: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
a060: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
a070: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
a080: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
a090: 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  4  STMT N VALUE.
a0a0: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
a0b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
a0c0: 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
a0d0: 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
a0e0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
a0f0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
a100: 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
a110: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a120: 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
a130: 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
a140: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
a150: 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
a160: 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
a170: 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69   int test_bind_i
a180: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
a190: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
a1a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a1b0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
a1c0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
a1d0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
a1e0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
a1f0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20   int idx;.  i64 
a200: 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
a210: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
a220: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
a230: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a240: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
a250: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
a260: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
a270: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
a280: 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
a290: 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
a2a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a2b0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
a2c0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
a2d0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
a2e0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
a2f0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
a300: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
a310: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a320: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
a330: 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
a340: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
a350: 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
a360: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a370: 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
a380: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a390: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
a3a0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
a3b0: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
a3c0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
a3d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
a3e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a3f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
a400: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
a410: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
a420: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20 53  3_bind_double  S
a430: 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
a440: 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
a450: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 69  e3_bind_double i
a460: 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
a470: 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
a480: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
a490: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
a4a0: 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
a4b0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a4c0: 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
a4d0: 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d  d.** binds a 64-
a4e0: 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55  bit integer VALU
a4f0: 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61  E to that wildca
a500: 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
a510: 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62  t test_bind_doub
a520: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
a530: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
a540: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
a550: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
a560: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a570: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
a580: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
a590: 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65  nt idx;.  double
a5a0: 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
a5b0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
a5c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
a5d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a5e0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
a5f0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
a600: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
a610: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a620: 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
a630: 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
a640: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a650: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
a660: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
a670: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
a680: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
a690: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
a6a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
a6b0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
a6c0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
a6d0: 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
a6e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
a6f0: 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  f( Tcl_GetDouble
a700: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a710: 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
a720: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a730: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
a740: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
a750: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
a760: 75 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ue);.  if( rc!=S
a770: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a780: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a790: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
a7a0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a7b0: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
a7c0: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d  3_bind_null  STM
a7d0: 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  T N.**.** Test t
a7e0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
a7f0: 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20  null interface. 
a800: 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
a810: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
a820: 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
a830: 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
a840: 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
a850: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
a860: 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
a870: 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77   a NULL to the w
a880: 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
a890: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
a8a0: 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
a8b0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
a8c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a8d0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
a8e0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
a8f0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
a900: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
a910: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
a920: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
a930: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
a940: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a950: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
a960: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
a970: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
a980: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
a990: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
a9a0: 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72  MT N", 0);.    r
a9b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a9c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
a9d0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
a9e0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
a9f0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
aa00: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
aa10: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
aa20: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
aa30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
aa40: 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
aa50: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
aa60: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
aa70: 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
aa80: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
aa90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
aaa0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
aab0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
aac0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
aad0: 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
aae0: 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e 20  nd_text  STMT N 
aaf0: 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a  STRING BYTES.**.
ab00: 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
ab10: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69 6e  te3_bind_text in
ab20: 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
ab30: 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
ab40: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
ab50: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
ab60: 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
ab70: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ab80: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
ab90: 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d  .** binds a UTF-
aba0: 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20  8 string STRING 
abb0: 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
abc0: 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20    The string is 
abd0: 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c  BYTES bytes.** l
abe0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
abf0: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78  nt test_bind_tex
ac00: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
ac10: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ac20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ac30: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ac40: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ac50: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
ac60: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
ac70: 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
ac80: 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
ac90: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
aca0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
acb0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
acc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
acd0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ace0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
acf0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
ad00: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
ad10: 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
ad20: 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  UE BYTES", 0);. 
ad30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ad40: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ad50: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
ad60: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
ad70: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
ad80: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
ad90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
ada0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
adb0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
adc0: 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
add0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ade0: 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53  value = Tcl_GetS
adf0: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
ae00: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
ae10: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ae20: 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
ae30: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ae40: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
ae50: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
ae60: 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
ae70: 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f  , bytes, SQLITE_
ae80: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66  TRANSIENT);.  if
ae90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aea0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
aeb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
aec0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
aed0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
aee0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
aef0: 78 74 31 36 20 20 53 54 4d 54 20 4e 20 53 54 52  xt16  STMT N STR
af00: 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ING BYTES.**.** 
af10: 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
af20: 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74  _bind_text16 int
af30: 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
af40: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
af50: 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
af60: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
af70: 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
af80: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
af90: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
afa0: 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31  ** binds a UTF-1
afb0: 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20  6 string STRING 
afc0: 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
afd0: 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20    The string is 
afe0: 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c  BYTES bytes.** l
aff0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
b000: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78  nt test_bind_tex
b010: 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t16(.  void * cl
b020: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
b030: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
b040: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
b050: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b060: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
b070: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
b080: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
b090: 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
b0a0: 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
b0b0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
b0c0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b0d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
b0e0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
b0f0: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
b100: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
b110: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
b120: 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
b130: 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b  ALUE BYTES", 0);
b140: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b150: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
b160: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
b170: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b180: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b190: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
b1a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
b1b0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
b1c0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
b1d0: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
b1e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b1f0: 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65    value = Tcl_Ge
b200: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
b210: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
b220: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
b230: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
b240: 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20  bjv[4], &bytes) 
b250: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b260: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
b270: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  te3_bind_text16(
b280: 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69  pStmt, idx, (voi
b290: 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73  d *)value, bytes
b2a0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
b2b0: 4e 54 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  NT);.  if( rc!=S
b2c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b2d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b2e0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b2f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
b300: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
b310: 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 53 54 4d  3_bind_blob  STM
b320: 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a 2a  T N DATA BYTES.*
b330: 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
b340: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
b350: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
b360: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
b370: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
b380: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
b390: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
b3a0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
b3b0: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
b3c0: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c  nd.** binds a BL
b3d0: 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  OB to the wildca
b3e0: 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69 73  rd.  The BLOB is
b3f0: 20 42 59 54 45 53 20 62 79 74 65 73 20 69 6e 20   BYTES bytes in 
b400: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
b410: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c  int test_bind_bl
b420: 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ob(.  void * cli
b430: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
b440: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
b450: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
b460: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b470: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
b480: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
b490: 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
b4a0: 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
b4b0: 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
b4c0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
b4d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b4e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
b4f0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
b500: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
b510: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
b520: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
b530: 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
b540: 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
b550: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b560: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
b570: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
b580: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
b590: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
b5a0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
b5b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
b5c0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
b5d0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
b5e0: 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
b5f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b600: 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53  value = Tcl_GetS
b610: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
b620: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
b630: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b640: 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
b650: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b660: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
b670: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
b680: 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
b690: 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f  , bytes, SQLITE_
b6a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66  TRANSIENT);.  if
b6b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b6c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
b6d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b6e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
b6f0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
b700: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
b710: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53  rameter_count  S
b720: 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
b730: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
b740: 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20  ildcards in the 
b750: 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e  given statement.
b760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b770: 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
b780: 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  er_count(.  void
b790: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
b7a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
b7b0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
b7c0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
b7d0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
b7e0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
b7f0: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
b800: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
b810: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
b820: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
b830: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
b840: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
b850: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
b860: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
b870: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b880: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
b890: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b8a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b8b0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
b8c0: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
b8d0: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
b8e0: 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20  ount(pStmt)));. 
b8f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
b900: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
b910: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
b920: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53  arameter_name  S
b930: 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74  TMT  N.**.** Ret
b940: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
b950: 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72 64  the Nth wildcard
b960: 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69 6c  .  The first wil
b970: 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41  dcard is 1..** A
b980: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
b990: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e 20  s returned if N 
b9a0: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
b9b0: 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
b9c0: 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73  rd.** is nameles
b9d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b9e0: 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
b9f0: 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69  eter_name(.  voi
ba00: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
ba10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
ba20: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
ba30: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
ba40: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
ba50: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
ba60: 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  mt;.  int i;..  
ba70: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
ba80: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
ba90: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
baa0: 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a  bjv, "STMT N");.
bab0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
bac0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
bad0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
bae0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
baf0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
bb00: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
bb10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
bb20: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
bb30: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
bb40: 32 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e  2], &i) ) return
bb50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
bb60: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
bb70: 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
bb80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
bb90: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
bba0: 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
bbb0: 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65  i),-1).  );.  re
bbc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
bbd0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
bbe0: 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a  ite3_errcode DB.
bbf0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
bc00: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
bc10: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  tation of the mo
bc20: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
bc30: 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72  3_* API.** error
bc40: 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c   code. e.g. "SQL
bc50: 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73  ITE_ERROR"..*/.s
bc60: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
bc70: 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a  rrcode(.  void *
bc80: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
bc90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
bca0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
bcb0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
bcc0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
bcd0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
bce0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
bcf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bd00: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
bd10: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
bd20: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
bd30: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
bd40: 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
bd50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
bd60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
bd70: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
bd80: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
bd90: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
bda0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
bdb0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
bdc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
bdd0: 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65  char *)errorName
bde0: 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  (sqlite3_errcode
bdf0: 28 64 62 29 29 2c 20 30 29 3b 0a 20 20 72 65 74  (db)), 0);.  ret
be00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
be10: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65  *.** Usage:   te
be20: 73 74 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a  st_errmsg DB.**.
be30: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55  ** Returns the U
be40: 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74  TF-8 representat
be50: 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ion of the error
be60: 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
be70: 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  for the.** most 
be80: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
be90: 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74   API call..*/.st
bea0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
beb0: 72 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63  rmsg(.  void * c
bec0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
bed0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
bee0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
bef0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bf00: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
bf10: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
bf20: 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28  ar *zErr;..  if(
bf30: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
bf40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bf50: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
bf60: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
bf70: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
bf80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
bf90: 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
bfa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bfb0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
bfc0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
bfd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
bfe0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
bff0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
c000: 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
c010: 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
c020: 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
c030: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
c040: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
c050: 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20  j(zErr, -1));.  
c060: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
c070: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
c080: 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44   test_errmsg16 D
c090: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
c0a0: 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65  the UTF-16 repre
c0b0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
c0c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
c0d0: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
c0e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
c0f0: 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
c100: 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20   This is a byte 
c110: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20  array object at 
c120: 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65  the TCL .** leve
c130: 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64  l, and it includ
c140: 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30  es the 0x00 0x00
c150: 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
c160: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
c170: 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  the.** UTF-16 st
c180: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
c190: 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31  int test_errmsg1
c1a0: 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
c1b0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
c1c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
c1d0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
c1e0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c1f0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  ].){.  sqlite *d
c200: 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
c210: 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 62 79 74  *zErr;.  int byt
c220: 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  es;..  if( objc!
c230: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
c240: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c250: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
c260: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
c270: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
c280: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
c290: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
c2a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c2b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
c2c0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
c2d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c2e0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
c2f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c300: 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
c310: 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29  te3_errmsg16(db)
c320: 3b 0a 20 20 62 79 74 65 73 20 3d 20 73 71 6c 69  ;.  bytes = sqli
c330: 74 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28  te3utf16ByteLen(
c340: 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  zErr, -1);.  Tcl
c350: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
c360: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
c370: 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20  eArrayObj(zErr, 
c380: 62 79 74 65 73 29 29 3b 0a 20 20 72 65 74 75 72  bytes));.  retur
c390: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
c3a0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
c3b0: 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c  3_prepare DB sql
c3c0: 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a   bytes tailvar.*
c3d0: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
c3e0: 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
c3f0: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
c400: 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
c410: 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
c420: 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
c430: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
c440: 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
c450: 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
c460: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
c470: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
c480: 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
c490: 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
c4a0: 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
c4b0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
c4c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
c4d0: 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f  st_prepare(.  vo
c4e0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
c4f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c500: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
c510: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
c520: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
c530: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
c540: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
c550: 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
c560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
c570: 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
c580: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
c590: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
c5a0: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
c5b0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
c5c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c5d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
c5e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
c5f0: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
c600: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
c610: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
c620: 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
c630: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
c640: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
c650: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
c660: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
c670: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
c680: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
c690: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
c6a0: 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
c6b0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
c6c0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
c6d0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
c6e0: 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
c6f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c700: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
c710: 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
c720: 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
c730: 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69  mt, &zTail);.  i
c740: 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
c750: 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
c760: 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
c770: 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71  tes - (zTail-zSq
c780: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  l);.    }.    Tc
c790: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
c7a0: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
c7b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
c7c0: 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c  j(zTail, bytes),
c7d0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
c7e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c7f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
c800: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69  t==0 );.    spri
c810: 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20  ntf(zBuf, "(%d) 
c820: 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
c830: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c840: 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
c850: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
c860: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c870: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
c880: 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
c890: 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72   if( makePointer
c8a0: 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
c8b0: 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
c8c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c8d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c8e0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
c8f0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
c900: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
c910: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
c920: 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20  _prepare DB sql 
c930: 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a  bytes tailvar.**
c940: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
c950: 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
c960: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
c970: 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
c980: 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
c990: 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
c9a0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
c9b0: 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
c9c0: 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
c9d0: 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
c9e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
c9f0: 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
ca00: 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
ca10: 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
ca20: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
ca30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
ca40: 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20 76  t_prepare16(.  v
ca50: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
ca60: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
ca70: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
ca80: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
ca90: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
caa0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
cab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
cac0: 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
cad0: 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
cae0: 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
caf0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
cb00: 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
cb10: 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
cb20: 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
cb30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
cb40: 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
cb50: 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
cb60: 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
cb70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
cb80: 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
cb90: 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
cba0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
cbb0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
cbc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
cbd0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
cbe0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
cbf0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
cc00: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
cc10: 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
cc20: 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ar", 0);.    ret
cc30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cc40: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
cc50: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
cc60: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cc70: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
cc80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cc90: 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42   zSql = Tcl_GetB
cca0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
ccb0: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e  objv[2], &objlen
ccc0: 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
ccd0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
cce0: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
ccf0: 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
cd00: 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 53  _ERROR;..  if( S
cd10: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
cd20: 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c 20  3_prepare16(db, 
cd30: 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
cd40: 74 6d 74 2c 20 26 7a 54 61 69 6c 29 20 29 7b 0a  tmt, &zTail) ){.
cd50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cd60: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
cd70: 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f 62   zTail ){.    ob
cd80: 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
cd90: 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
cda0: 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73   *)zSql);.  }els
cdb0: 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  e{.    objlen = 
cdc0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20 3d  0;.  }.  pTail =
cdd0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
cde0: 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c  yObj((u8 *)zTail
cdf0: 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c  , objlen);.  Tcl
ce00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _IncrRefCount(pT
ce10: 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53  ail);.  Tcl_ObjS
ce20: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
ce30: 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
ce40: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
ce50: 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
ce60: 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
ce70: 0a 20 20 20 20 69 66 28 20 6d 61 6b 65 50 6f 69  .    if( makePoi
ce80: 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
ce90: 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
cea0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ceb0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
cec0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ced0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
cee0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
cef0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
cf00: 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65  e3_open filename
cf10: 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a   ?options-list?.
cf20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
cf30: 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20  st_open(.  void 
cf40: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
cf50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
cf60: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
cf70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
cf80: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
cf90: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
cfa0: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
cfb0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
cfc0: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
cfd0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
cfe0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
cff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d000: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
d010: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
d020: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
d030: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d040: 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
d050: 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
d060: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d070: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
d080: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63    zFilename = Tc
d090: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d0a0: 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  [1]);.  rc = sql
d0b0: 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e  ite3_open(zFilen
d0c0: 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
d0d0: 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53  if( makePointerS
d0e0: 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
d0f0: 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
d100: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
d110: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d120: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
d130: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
d140: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
d150: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69  qlite3_open16 fi
d160: 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a  lename options.*
d170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
d180: 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64  t_open16(.  void
d190: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
d1a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d1b0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
d1c0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
d1d0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
d1e0: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
d1f0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
d200: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
d210: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
d220: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
d230: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
d240: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d250: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
d260: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
d270: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
d280: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
d290: 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d  ilename options-
d2a0: 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72  list", 0);.    r
d2b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d2c0: 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d  .  }..  zFilenam
d2d0: 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  e = Tcl_GetByteA
d2e0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
d2f0: 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20  [1], 0);.  rc = 
d300: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a  sqlite3_open16(z
d310: 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
d320: 20 20 0a 20 20 69 66 28 20 6d 61 6b 65 50 6f 69    .  if( makePoi
d330: 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
d340: 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
d350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d360: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d370: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
d380: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
d390: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
d3a0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  ge: sqlite3_comp
d3b0: 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73  lete16 <UTF-16 s
d3c0: 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74  tring>.**.** Ret
d3d0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 73 75 70  urn 1 if the sup
d3e0: 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69  plied argument i
d3f0: 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  s a complete SQL
d400: 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a   statement, or z
d410: 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
d420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d430: 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28  test_complete16(
d440: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
d450: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
d460: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
d470: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
d480: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
d490: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  ){.  char *zBuf;
d4a0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
d4b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
d4c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
d4d0: 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31  1, objv, "<utf-1
d4e0: 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65  6 sql>");.    re
d4f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d500: 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 54 63    }..  zBuf = Tc
d510: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
d520: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
d530: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
d540: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
d550: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
d560: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a  te3_complete16(z
d570: 42 75 66 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  Buf)));.  return
d580: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
d590: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
d5a0: 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  _step STMT.**.**
d5b0: 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61   Advance the sta
d5c0: 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  tement to the ne
d5d0: 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  xt row..*/.stati
d5e0: 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28  c int test_step(
d5f0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
d600: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
d610: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
d620: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
d630: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
d640: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
d650: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
d660: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
d670: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
d680: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d690: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d6a0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d6b0: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
d6c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
d6d0: 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
d6e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d6f0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
d700: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
d710: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
d720: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
d730: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
d740: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
d750: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
d760: 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20  tmt);..  /* if( 
d770: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d780: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  && rc!=SQLITE_RO
d790: 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  W ) return TCL_E
d7a0: 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53  RROR; */.  Tcl_S
d7b0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
d7c0: 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61   (char *)errorNa
d7d0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
d7e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
d7f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
d800: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
d810: 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65  t STMT .**.** Re
d820: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
d830: 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  of columns retur
d840: 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73  ned by the sql s
d850: 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a  tatement STMT..*
d860: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
d870: 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a  t_column_count(.
d880: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
d890: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
d8a0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
d8b0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
d8c0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
d8d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
d8e0: 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
d8f0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
d900: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d910: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
d920: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
d930: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
d940: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d950: 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
d960: 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
d970: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d980: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
d990: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
d9a0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
d9b0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
d9c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
d9d0: 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  RROR;..  Tcl_Set
d9e0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
d9f0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
da00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
da10: 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20  ount(pStmt)));. 
da20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
da30: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
da40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
da50: 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ype STMT column.
da60: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
da70: 20 74 79 70 65 20 6f 66 20 74 68 65 20 64 61 74   type of the dat
da80: 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c  a in column 'col
da90: 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72  umn' of the curr
daa0: 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ent row..*/.stat
dab0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
dac0: 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20  mn_type(.  void 
dad0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
dae0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
daf0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
db00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
db10: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
db20: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
db30: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69  ;.  int col;.  i
db40: 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62  nt tp;..  if( ob
db50: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
db60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
db70: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
db80: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
db90: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
dba0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
dbb0: 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
dbc0: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
dbd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dbe0: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
dbf0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
dc00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
dc10: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
dc20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
dc30: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
dc40: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
dc50: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
dc60: 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
dc70: 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73  ERROR;..  tp = s
dc80: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
dc90: 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  pe(pStmt, col);.
dca0: 20 20 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a    switch( tp ){.
dcb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
dcc0: 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20  INTEGER: .      
dcd0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
dce0: 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c  terp, "INTEGER",
dcf0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
dd00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dd10: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
dd20: 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
dd30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e  esult(interp, "N
dd40: 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  ULL", TCL_STATIC
dd50: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
dd60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
dd70: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63  _FLOAT:.      Tc
dd80: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
dd90: 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c  rp, "FLOAT", TCL
dda0: 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
ddb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ddc0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20   SQLITE_TEXT:.  
ddd0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
dde0: 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22  t(interp, "TEXT"
ddf0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
de00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
de10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
de20: 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  B:.      Tcl_Set
de30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
de40: 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49  BLOB", TCL_STATI
de50: 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
de60: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
de70: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
de80: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
de90: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
dea0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
deb0: 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20  lumn_int64 STMT 
dec0: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
ded0: 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20  urn the data in 
dee0: 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
def0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
df00: 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a  ow cast as an.**
df10: 20 77 69 64 65 20 28 36 34 2d 62 69 74 29 20 69   wide (64-bit) i
df20: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
df30: 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
df40: 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20  n_int64(.  void 
df50: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
df60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
df70: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
df80: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
df90: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
dfa0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
dfb0: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69  ;.  int col;.  i
dfc0: 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20  64 iVal;..  if( 
dfd0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
dfe0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
dff0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
e000: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
e010: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
e020: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e030: 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
e040: 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
e050: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e060: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
e070: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
e080: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
e090: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
e0a0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
e0b0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
e0c0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
e0d0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
e0e0: 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
e0f0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c  L_ERROR;..  iVal
e100: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e110: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63  n_int64(pStmt, c
e120: 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ol);.  Tcl_SetOb
e130: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
e140: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
e150: 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75  j(iVal));.  retu
e160: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
e170: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
e180: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53  e3_column_blob S
e190: 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
e1a0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
e1b0: 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69  lumn_blob(.  voi
e1c0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
e1d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e1e0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
e1f0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
e200: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
e210: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
e220: 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a  mt;.  int col;..
e230: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e    int len;.  con
e240: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a  st void *pBlob;.
e250: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
e260: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
e270: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e280: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
e290: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
e2a0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e2b0: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
e2c0: 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
e2d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e2e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
e2f0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
e300: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
e310: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
e320: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
e330: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
e340: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
e350: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
e360: 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
e370: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e380: 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  pBlob = sqlit
e390: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
e3a0: 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 6c 65  Stmt, col);.  le
e3b0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
e3c0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
e3d0: 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
e3e0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
e3f0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
e400: 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29  yObj(pBlob, len)
e410: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
e420: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
e430: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
e440: 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63  mn_double STMT c
e450: 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  olumn.**.** Retu
e460: 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  rn the data in c
e470: 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
e480: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
e490: 77 20 63 61 73 74 20 61 73 20 61 20 64 6f 75 62  w cast as a doub
e4a0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
e4b0: 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f  t test_column_do
e4c0: 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  uble(.  void * c
e4d0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
e4e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e4f0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
e500: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
e510: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
e520: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
e530: 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62   int col;.  doub
e540: 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20  le rVal;..  if( 
e550: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
e560: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e570: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
e580: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
e590: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
e5a0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e5b0: 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
e5c0: 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
e5d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e5e0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
e5f0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
e600: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
e610: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
e620: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
e630: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
e640: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
e650: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
e660: 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
e670: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c  L_ERROR;..  rVal
e680: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e690: 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  n_double(pStmt, 
e6a0: 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
e6b0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
e6c0: 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
e6d0: 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75  j(rVal));.  retu
e6e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
e6f0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
e700: 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54  e3_data_count ST
e710: 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
e720: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
e730: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
e740: 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
e750: 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
e760: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61  atic int test_da
e770: 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  ta_count(.  void
e780: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
e790: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e7a0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
e7b0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
e7c0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
e7d0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
e7e0: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
e7f0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
e800: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e810: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
e820: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
e830: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
e840: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
e850: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
e860: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e870: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
e880: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
e890: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
e8a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
e8b0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
e8c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e8d0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
e8e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
e8f0: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
e900: 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74  3_data_count(pSt
e910: 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
e920: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e930: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
e940: 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54  column_text STMT
e950: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
e960: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
e970: 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d  umn_decltype STM
e980: 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
e990: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
e9a0: 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63  lumn_name STMT c
e9b0: 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
e9c0: 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  int test_stmt_ut
e9d0: 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  f8(.  void * cli
e9e0: 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20 20  entData,        
e9f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
ea00: 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
ea10: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a  n to be invoke *
ea20: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
ea30: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
ea40: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
ea50: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
ea60: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
ea70: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
ea80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28  .  const char *(
ea90: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
eaa0: 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c  stmt*, int) = cl
eab0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 63 6f 6e 73  ientData;.  cons
eac0: 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20  t char *zRet;.. 
ead0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
eae0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
eaf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
eb00: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
eb10: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
eb20: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
eb30: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
eb40: 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
eb50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
eb60: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
eb70: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
eb80: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
eb90: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
eba0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
ebb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
ebc0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
ebd0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
ebe0: 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
ebf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ec00: 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74  zRet = xFunc(pSt
ec10: 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20  mt, col);.  if( 
ec20: 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f  zRet ){.    Tcl_
ec30: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ec40: 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20  , (char *)zRet, 
ec50: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
ec60: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
ec70: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
ec80: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
ec90: 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
eca0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
ecb0: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
ecc0: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
ecd0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
ece0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
ecf0: 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
ed00: 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75   int test_stmt_u
ed10: 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  tf16(.  void * c
ed20: 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f  lientData,     /
ed30: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
ed40: 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
ed50: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a   to be invoked *
ed60: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
ed70: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
ed80: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
ed90: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
eda0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
edb0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
edc0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
edd0: 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
ede0: 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74  zName16;.  const
edf0: 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28   void *(*xFunc)(
ee00: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
ee10: 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  nt) = clientData
ee20: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
ee30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ee40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ee50: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
ee60: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
ee70: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
ee80: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
ee90: 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
eea0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
eeb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
eec0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
eed0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
eee0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
eef0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ef00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ef10: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
ef20: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
ef30: 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
ef40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ef50: 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78  ;..  zName16 = x
ef60: 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29  Func(pStmt, col)
ef70: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20  ;.  if( zName16 
ef80: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63  ){.    pRet = Tc
ef90: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
efa0: 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71 6c 69 74  j(zName16, sqlit
efb0: 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28 7a  e3utf16ByteLen(z
efc0: 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32 29 3b 0a  Name16, -1)+2);.
efd0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
efe0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
eff0: 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  t);.  }..  retur
f000: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
f010: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
f020: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d  3_column_int STM
f030: 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
f040: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
f050: 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20  lumn_bytes STMT 
f060: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
f070: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
f080: 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20  mn_bytes16 STMT 
f090: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61  column.**.*/.sta
f0a0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
f0b0: 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_int(.  void * 
f0c0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f  clientData,    /
f0d0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
f0e0: 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
f0f0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a   to be invoked *
f100: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
f110: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
f120: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
f130: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
f140: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
f150: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
f160: 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
f170: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
f180: 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  nt) = clientData
f190: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
f1a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
f1b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f1c0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
f1d0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
f1e0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
f1f0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
f200: 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
f210: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
f230: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
f240: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
f250: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
f260: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
f270: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f280: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
f290: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
f2a0: 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
f2b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f2c0: 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
f2d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
f2e0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e  l_NewIntObj(xFun
f2f0: 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b  c(pStmt, col)));
f300: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
f320: 3a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  :  sqlite3OsOpen
f330: 52 65 61 64 57 72 69 74 65 20 3c 66 69 6c 65 6e  ReadWrite <filen
f340: 61 6d 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame>.*/.static i
f350: 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  nt test_sqlite3O
f360: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a  sOpenReadWrite(.
f370: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f380: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
f390: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f3a0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f3b0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f3c0: 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70 46 69  {.  OsFile * pFi
f3d0: 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  le;.  int rc;.  
f3e0: 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 63 68 61  int dummy;.  cha
f3f0: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
f400: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
f410: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f420: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
f430: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
f440: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
f450: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
f460: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
f470: 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  name", 0);.    r
f480: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f490: 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65 20 3d 20  .  }..  pFile = 
f4a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
f4b0: 65 6f 66 28 4f 73 46 69 6c 65 29 29 3b 0a 20 20  eof(OsFile));.  
f4c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
f4d0: 65 6e 52 65 61 64 57 72 69 74 65 28 54 63 6c 5f  enReadWrite(Tcl_
f4e0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f4f0: 5d 29 2c 20 70 46 69 6c 65 2c 20 26 64 75 6d 6d  ]), pFile, &dumm
f500: 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  y);.  if( rc!=SQ
f510: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
f520: 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c 65 29  qliteFree(pFile)
f530: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ;.    Tcl_SetRes
f540: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
f550: 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63  r *)errorName(rc
f560: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
f570: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f580: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 61 6b 65  RROR;.  }.  make
f590: 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
f5a0: 70 2c 20 7a 42 75 66 2c 20 70 46 69 6c 65 29 3b  p, zBuf, pFile);
f5b0: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
f5c0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
f5d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
f5e0: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
f5f0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f  Usage:  sqlite3O
f600: 73 43 6c 6f 73 65 20 3c 66 69 6c 65 20 68 61 6e  sClose <file han
f610: 64 6c 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle>.*/.static i
f620: 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  nt test_sqlite3O
f630: 73 43 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a  sClose(.  void *
f640: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
f650: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
f660: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
f670: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
f680: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69  objv[].){.  OsFi
f690: 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e  le * pFile;.  in
f6a0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
f6b0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
f6c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f6d0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f6e0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f6f0: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
f700: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
f710: 29 2c 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 22  ), " filehandle"
f720: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
f730: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
f740: 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f  .  if( getFilePo
f750: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
f760: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
f770: 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b  [1]), &pFile) ){
f780: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f790: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
f7a0: 3d 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  = sqlite3OsClose
f7b0: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
f7c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f7d0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
f7e0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
f7f0: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  *)errorName(rc),
f800: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
f810: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f820: 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
f830: 46 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 72  Free(pFile);.  r
f840: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f850: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
f860: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 20 3c 66 69  qlite3OsLock <fi
f870: 6c 65 20 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b  le handle> <lock
f880: 74 79 70 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20  type>.*/.static 
f890: 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33  int test_sqlite3
f8a0: 4f 73 4c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a  OsLock(.  void *
f8b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
f8c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
f8d0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
f8e0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
f8f0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69  objv[].){.  OsFi
f900: 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e  le * pFile;.  in
f910: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
f920: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f930: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f940: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f950: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f960: 22 2c 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ", .        Tcl_
f970: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
f980: 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22 20 66  ]), .        " f
f990: 69 6c 65 68 61 6e 64 6c 65 20 28 53 48 41 52 45  ilehandle (SHARE
f9a0: 44 7c 52 45 53 45 52 56 45 44 7c 50 45 4e 44 49  D|RESERVED|PENDI
f9b0: 4e 47 7c 45 58 43 4c 55 53 49 56 45 29 22 2c 20  NG|EXCLUSIVE)", 
f9c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
f9d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
f9e0: 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e   if( getFilePoin
f9f0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
fa00: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
fa10: 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20  ]), &pFile) ){. 
fa20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fa30: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
fa40: 30 3d 3d 73 74 72 63 6d 70 28 22 53 48 41 52 45  0==strcmp("SHARE
fa50: 44 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  D", Tcl_GetStrin
fa60: 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20  g(objv[2])) ){. 
fa70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fa80: 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 53 48 41  sLock(pFile, SHA
fa90: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20  RED_LOCK);.  }. 
faa0: 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 74 72   else if( 0==str
fab0: 63 6d 70 28 22 52 45 53 45 52 56 45 44 22 2c 20  cmp("RESERVED", 
fac0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
fad0: 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72  jv[2])) ){.    r
fae0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
faf0: 6b 28 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  k(pFile, RESERVE
fb00: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65  D_LOCK);.  }.  e
fb10: 6c 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d  lse if( 0==strcm
fb20: 70 28 22 50 45 4e 44 49 4e 47 22 2c 20 54 63 6c  p("PENDING", Tcl
fb30: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
fb40: 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  2])) ){.    rc =
fb50: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
fb60: 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f  File, PENDING_LO
fb70: 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  CK);.  }.  else 
fb80: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 45  if( 0==strcmp("E
fb90: 58 43 4c 55 53 49 56 45 22 2c 20 54 63 6c 5f 47  XCLUSIVE", Tcl_G
fba0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
fbb0: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  )) ){.    rc = s
fbc0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69  qlite3OsLock(pFi
fbd0: 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  le, EXCLUSIVE_LO
fbe0: 43 4b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK);.  }else{.  
fbf0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
fc00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
fc10: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
fc20: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
fc30: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
fc40: 6f 62 6a 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20  objv[0]), .     
fc50: 20 20 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 20     " filehandle 
fc60: 28 53 48 41 52 45 44 7c 52 45 53 45 52 56 45 44  (SHARED|RESERVED
fc70: 7c 50 45 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49  |PENDING|EXCLUSI
fc80: 56 45 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  VE)", 0);.    re
fc90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fca0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
fcb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fcc0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
fcd0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72  terp, (char *)er
fce0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
fcf0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
fd00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fd10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
fd20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
fd30: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 55  age:  sqlite3OsU
fd40: 6e 6c 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64  nlock <file hand
fd50: 6c 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le>.*/.static in
fd60: 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  t test_sqlite3Os
fd70: 55 6e 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a  Unlock(.  void *
fd80: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
fd90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fda0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
fdb0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
fdc0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69  objv[].){.  OsFi
fdd0: 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e  le * pFile;.  in
fde0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
fdf0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
fe00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fe10: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
fe20: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
fe30: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
fe40: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
fe50: 29 2c 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 22  ), " filehandle"
fe60: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
fe70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
fe80: 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f  .  if( getFilePo
fe90: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
fea0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
feb0: 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b  [1]), &pFile) ){
fec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fed0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
fee0: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
fef0: 6b 28 70 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  k(pFile, NO_LOCK
ff00: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ff10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
ff20: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
ff30: 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f  rp, (char *)erro
ff40: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
ff50: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
ff60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ff70: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
ff80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
ff90: 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d  e:  sqlite3OsTem
ffa0: 70 46 69 6c 65 4e 61 6d 65 0a 2a 2f 0a 73 74 61  pFileName.*/.sta
ffb0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
ffc0: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
ffd0: 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
ffe0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
fff0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10000 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10010 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10020 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 7a 46 69  [].){.  char zFi
10030 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  le[SQLITE_TEMPNA
10040 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  ME_SIZE];.  int 
10050 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
10060 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
10070 65 28 7a 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  e(zFile);.  if( 
10080 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10090 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
100a0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
100b0 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29   *)errorName(rc)
100c0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
100d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
100e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  ROR;.  }.  Tcl_A
100f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10100 72 70 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20  rp, zFile, 0);. 
10110 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10120 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
10130 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20  r commands with 
10140 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
10150 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69  ter..*/.int Sqli
10160 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
10170 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
10180 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  {.  extern int s
10190 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
101a0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
101b0 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  t sqlite3_interr
101c0 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  upt_count;.  ext
101d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
101e0 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b  open_file_count;
101f0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
10200 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
10210 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72  me;.  static str
10220 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
10230 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
10240 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  _CmdProc *xProc;
10250 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a  .  } aCmd[] = {.
10260 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10270 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20  mprintf_int",   
10280 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
10290 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
102a0 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a  rintf_int    },.
102b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
102c0 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20  mprintf_int64", 
102d0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
102e0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
102f0 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a  rintf_int64  },.
10300 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10310 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  mprintf_str",   
10320 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
10330 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
10340 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a  rintf_str    },.
10350 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10360 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22  mprintf_stronly"
10370 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
10380 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
10390 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a  rintf_stronly},.
103a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
103b0 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c  mprintf_double",
103c0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
103d0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
103e0 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a  rintf_double },.
103f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10400 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c  mprintf_scaled",
10410 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
10420 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
10430 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a  rintf_scaled },.
10440 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10450 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c  mprintf_z_test",
10460 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
10470 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e  Proc*)test_mprin
10480 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20  tf_z        },. 
10490 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
104a0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
104b0 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ",     (Tcl_CmdP
104c0 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72  roc*)test_last_r
104d0 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20  owid       },.  
104e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
104f0 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  ec_printf",     
10500 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
10510 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72  oc*)test_exec_pr
10520 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20  intf      },.   
10530 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74    { "sqlite3_get
10540 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20  _table_printf", 
10550 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
10560 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c  c*)test_get_tabl
10570 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20 20 20 20  e_printf },.    
10580 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73   { "sqlite3_clos
10590 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
105a0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
105b0 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c  *)sqlite_test_cl
105c0 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ose     },.     
105d0 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
105e0 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
105f0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
10600 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e  )test_create_fun
10610 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b  ction  },.     {
10620 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
10630 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20 20  _aggregate",    
10640 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
10650 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
10660 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20  egate },.     { 
10670 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72  "sqlite_register
10680 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  _test_function",
10690 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
106a0 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e  est_register_fun
106b0 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  c    },.     { "
106c0 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20  sqlite_abort",  
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
106f0 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20  lite_abort      
10700 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51      },.#ifdef SQ
10710 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
10720 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  { "sqlite_malloc
10730 5f 66 61 69 6c 22 2c 20 20 20 20 20 20 20 20 20  _fail",         
10740 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
10750 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66  )sqlite_malloc_f
10760 61 69 6c 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ail    },.     {
10770 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f   "sqlite_malloc_
10780 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 20  stat",          
10790 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
107a0 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74  sqlite_malloc_st
107b0 61 74 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  at    },.#endif.
107c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62       { "sqlite_b
107d0 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  ind",           
107e0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
107f0 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20  Proc*)test_bind 
10800 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
10810 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e      { "breakpoin
10820 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
10830 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
10840 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61 6b 70  roc*)test_breakp
10850 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20  oint       },.  
10860 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65     { "sqlite3_ke
10870 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
10880 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
10890 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20 20 20  oc*)test_key    
108a0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
108b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6b    { "sqlite3_rek
108c0 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey",            
108d0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
108e0 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20 20 20  c*)test_rekey   
108f0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
10900 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
10910 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
10920 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62  ame;.     Tcl_Ob
10930 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  jCmdProc *xProc;
10940 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65  .     void *clie
10950 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a  ntData;.  } aObj
10960 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  Cmd[] = {.     {
10970 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
10980 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
10990 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c    test_bind_int,
109a0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
109b0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
109c0 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
109d0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
109e0 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  64,    0 },.    
109f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
10a00 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
10a10 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f      test_bind_do
10a20 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20  uble,   0 },.   
10a30 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
10a40 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20  d_null",        
10a50 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e       test_bind_n
10a60 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ull     ,0 },.  
10a70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
10a80 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20  nd_text",       
10a90 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
10aa0 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20  text     ,0 },. 
10ab0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
10ac0 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20  ind_text16",    
10ad0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
10ae0 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a  _text16   ,0 },.
10af0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10b00 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20  bind_blob",     
10b10 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
10b20 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c  d_blob     ,0 },
10b30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
10b40 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
10b50 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69  count",  test_bi
10b60 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
10b70 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  nt, 0},.     { "
10b80 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
10b90 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20  ameter_name",   
10ba0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
10bb0 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20  ter_name,  0},. 
10bc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
10bd0 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20  rrcode",        
10be0 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 63         test_errc
10bf0 6f 64 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ode       ,0 },.
10c00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10c10 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20  errmsg",        
10c20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
10c30 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  msg        ,0 },
10c40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
10c50 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20  _errmsg16",     
10c60 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
10c70 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d  rmsg16      ,0 }
10c80 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
10c90 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20  3_open",        
10ca0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
10cb0 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20  pen          ,0 
10cc0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
10cd0 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20  e3_open16",     
10ce0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
10cf0 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30  open16        ,0
10d00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
10d10 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c  te3_complete16",
10d20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
10d30 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c  _complete16    ,
10d40 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
10d50 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20  lite3_prepare", 
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
10d70 73 74 5f 70 72 65 70 61 72 65 20 20 20 20 20 20  st_prepare      
10d80 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
10d90 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
10da0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
10db0 65 73 74 5f 70 72 65 70 61 72 65 31 36 20 20 20  est_prepare16   
10dc0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
10dd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10de0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
10df0 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20  test_finalize   
10e00 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
10e10 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c  "sqlite3_reset",
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20   test_reset     
10e40 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
10e50 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65   "sqlite3_change
10e60 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
10e70 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20 20    test_changes  
10e80 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
10e90 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70 22  { "sqlite3_step"
10ea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10eb0 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20 20     test_step    
10ec0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20        ,0 },..   
10ed0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    /* sqlite3_col
10ee0 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20  umn_*() API */. 
10ef0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
10f00 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20  olumn_count",   
10f10 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
10f20 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a  mn_count  ,0 },.
10f30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
10f40 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20  data_count",    
10f50 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 61 74          test_dat
10f60 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c  a_count    ,0 },
10f70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
10f80 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20  _column_type",  
10f90 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
10fa0 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d  lumn_type   ,0 }
10fb0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
10fc0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20  3_column_blob", 
10fd0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
10fe0 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20  olumn_blob   ,0 
10ff0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
11000 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
11010 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
11020 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30  column_double ,0
11030 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
11040 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
11050 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
11060 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c  _column_int64  ,
11070 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
11080 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22  ite3_column_int"
11090 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74  ,        test_st
110a0 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74 65  mt_int,   sqlite
110b0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 20 20  3_column_int    
110c0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
110d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
110e0 65 73 22 2c 20 20 20 20 20 20 74 65 73 74 5f 73  es",      test_s
110f0 74 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74  tmt_int,   sqlit
11100 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20  e3_column_bytes 
11110 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
11120 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
11130 74 65 73 31 36 22 2c 20 20 20 20 74 65 73 74 5f  tes16",    test_
11140 73 74 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69  stmt_int,   sqli
11150 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
11160 31 36 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  16   },.     { "
11170 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
11180 65 78 74 22 2c 20 20 20 20 20 20 20 74 65 73 74  ext",       test
11190 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 73 71 6c  _stmt_utf8,  sql
111a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
111b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
111c0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
111d0 64 65 63 6c 74 79 70 65 22 2c 20 20 20 74 65 73  decltype",   tes
111e0 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 73 71  t_stmt_utf8,  sq
111f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
11200 6c 74 79 70 65 20 20 7d 2c 0a 20 20 20 20 20 7b  ltype  },.     {
11210 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
11220 5f 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 74 65  _name",       te
11230 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 73  st_stmt_utf8,  s
11240 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
11250 6d 65 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  me      },.     
11260 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
11270 6e 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20 74  n_text16",     t
11280 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
11290 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
112a0 65 78 74 31 36 20 20 20 20 7d 2c 0a 20 20 20 20  ext16    },.    
112b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
112c0 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 20  mn_decltype16", 
112d0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
112e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
112f0 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 20 20 20  decltype16},.   
11300 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
11310 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 20 20  umn_name16",    
11320 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
11330 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
11340 5f 6e 61 6d 65 31 36 20 20 20 20 7d 2c 0a 0a 20  _name16    },.. 
11350 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73      /* Functions
11360 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 20 20   from os.h */.  
11370 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 4f     { "sqlite3OsO
11380 70 65 6e 52 65 61 64 57 72 69 74 65 22 2c 74 65  penReadWrite",te
11390 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  st_sqlite3OsOpen
113a0 52 65 61 64 57 72 69 74 65 2c 20 30 20 7d 2c 0a  ReadWrite, 0 },.
113b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f       { "sqlite3O
113c0 73 43 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  sClose",        
113d0 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c  test_sqlite3OsCl
113e0 6f 73 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ose, 0 },.     {
113f0 20 22 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 22   "sqlite3OsLock"
11400 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ,         test_s
11410 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 2c 20 30 20  qlite3OsLock, 0 
11420 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
11430 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
11440 22 2c 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  ", test_sqlite3O
11450 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 2c 20 30  sTempFileName, 0
11460 20 7d 2c 0a 20 20 20 0a 20 20 20 20 20 2f 2a 20   },.   .     /* 
11470 43 75 73 74 6f 6d 20 74 65 73 74 20 69 6e 74 65  Custom test inte
11480 72 66 61 63 65 73 20 2a 2f 0a 20 20 20 20 20 7b  rfaces */.     {
11490 20 22 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63   "sqlite3OsUnloc
114a0 6b 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  k",         test
114b0 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b  _sqlite3OsUnlock
114c0 2c 20 30 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  , 0    },.     {
114d0 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
114e0 74 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  te",        test
114f0 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
11500 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
11510 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
11520 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74  te_needed", test
11530 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c  _collate_needed,
11540 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b   0     },.     {
11550 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74   "add_test_funct
11560 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74  ion",       test
11570 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20  _function, 0    
11580 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
11590 20 22 73 71 6c 69 74 65 33 5f 63 72 61 73 68 70   "sqlite3_crashp
115a0 61 72 61 6d 73 22 2c 20 20 20 20 20 73 71 6c 69  arams",     sqli
115b0 74 65 33 5f 63 72 61 73 68 70 61 72 61 6d 73 2c  te3_crashparams,
115c0 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b   0     },.     {
115d0 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65   "sqlite3_test_e
115e0 72 72 73 74 72 22 2c 20 20 20 20 20 74 65 73 74  rrstr",     test
115f0 5f 65 72 72 73 74 72 2c 20 30 20 20 20 20 20 20  _errstr, 0      
11600 20 20 20 20 20 20 20 7d 2c 0a 0a 20 20 7d 3b 0a         },..  };.
11610 20 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72    int i;.  exter
11620 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  n int sqlite3_os
11630 5f 74 72 61 63 65 3b 0a 0a 20 20 66 6f 72 28 69  _trace;..  for(i
11640 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d  =0; i<sizeof(aCm
11650 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30  d)/sizeof(aCmd[0
11660 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  ]); i++){.    Tc
11670 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
11680 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e  interp, aCmd[i].
11690 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78  zName, aCmd[i].x
116a0 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Proc, 0, 0);.  }
116b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
116c0 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69  zeof(aObjCmd)/si
116d0 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29  zeof(aObjCmd[0])
116e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
116f0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
11700 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64  (interp, aObjCmd
11710 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [i].zName, .    
11720 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78      aObjCmd[i].x
11730 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  Proc, aObjCmd[i]
11740 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b  .clientData, 0);
11750 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  .  }.  Tcl_LinkV
11760 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
11770 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22  te_search_count"
11780 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
11790 26 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f  &sqlite3_search_
117a0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
117b0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
117c0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
117d0 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  ite_interrupt_co
117e0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
117f0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74  ar*)&sqlite3_int
11800 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43  errupt_count, TC
11810 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
11820 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
11830 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  p, "sqlite_open_
11840 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  file_count", .  
11850 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
11860 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  te3_open_file_co
11870 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
11880 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
11890 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
118a0 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c  e_current_time",
118b0 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
118c0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
118d0 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  time, TCL_LINK_I
118e0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
118f0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
11900 74 65 5f 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20  te_os_trace",.  
11910 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
11920 74 65 33 5f 6f 73 5f 74 72 61 63 65 2c 20 54 43  te3_os_trace, TC
11930 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
11940 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
11950 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69  p, "sqlite_stati
11960 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20  c_bind_value",. 
11970 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
11980 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
11990 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  value, TCL_LINK_
119a0 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c  STRING);.  Tcl_L
119b0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
119c0 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65  sqlite_temp_dire
119d0 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63  ctory",.      (c
119e0 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 74 65 6d  har*)&sqlite_tem
119f0 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  p_directory, TCL
11a00 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
11a10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11a20 7d 0a                                            }.