/ Hex Artifact Content
Login

Artifact 2ba6be1ffd072792dcdd65f1306ff4e2320aee4e:


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 31 34 32 20 32 30 30 35 2f 30 36  ,v 1.142 2005/06
0240: 2f 30 37 20 30 32 3a 31 32 3a 33 30 20 64 72 68  /07 02:12:30 drh
0250: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0260: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0270: 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68  .#include "tcl.h
0280: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
0290: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ".#include <stdl
02a0: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
02b0: 73 74 72 69 6e 67 2e 68 3e 0a 0a 63 6f 6e 73 74  string.h>..const
02c0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 54 65   char *sqlite3Te
02d0: 73 74 45 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20  stErrorName(int 
02e0: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
02f0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
0300: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
0310: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
0320: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
0330: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
0340: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0350: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
0360: 52 52 4f 52 3a 20 20 20 20 20 20 7a 4e 61 6d 65  RROR:      zName
0370: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
0380: 22 3b 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: 49 4e 54 45 52 4e 41 4c 3a 20 20 20 7a 4e 61 6d  INTERNAL:   zNam
03b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
03c0: 52 4e 41 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b  RNAL";    break;
03d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
03e0: 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 7a 4e 61  _PERM:       zNa
03f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52  me = "SQLITE_PER
0400: 4d 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  M";        break
0410: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0420: 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 7a 4e  E_ABORT:      zN
0430: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
0440: 4f 52 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  ORT";       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 42 55 53 59 3a 20 20 20 20 20 20 20 7a  TE_BUSY:       z
0470: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
0480: 55 53 59 22 3b 20 20 20 20 20 20 20 20 62 72 65  USY";        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 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
04b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
04c0: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 62 72  LOCKED";      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 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
04f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0500: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62  _NOMEM";       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 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
0530: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0540: 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20  E_READONLY";    
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 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
0570: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
0580: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
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 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
05b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
05c0: 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20  ITE_IOERR";     
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 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
05f0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
0600: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
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 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
0630: 4e 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ND:   zName = "S
0640: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b  QLITE_NOTFOUND";
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 46 55 4c 4c 3a  ase SQLITE_FULL:
0670: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0680: 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20  SQLITE_FULL";   
0690: 20 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 43 41 4e 54  case SQLITE_CANT
06b0: 4f 50 45 4e 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OPEN:   zName = 
06c0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
06d0: 22 3b 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 50 52 4f   case SQLITE_PRO
06f0: 54 4f 43 4f 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d  TOCOL:   zName =
0700: 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
0710: 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
0720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
0730: 50 54 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  PTY:      zName 
0740: 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22  = "SQLITE_EMPTY"
0750: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
0760: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
0770: 43 48 45 4d 41 3a 20 20 20 20 20 7a 4e 61 6d 65  CHEMA:     zName
0780: 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d   = "SQLITE_SCHEM
0790: 41 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A";      break;.
07a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
07b0: 54 4f 4f 42 49 47 3a 20 20 20 20 20 7a 4e 61 6d  TOOBIG:     zNam
07c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42  e = "SQLITE_TOOB
07d0: 49 47 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  IG";      break;
07e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
07f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 4e 61  _CONSTRAINT: zNa
0800: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
0810: 53 54 52 41 49 4e 54 22 3b 20 20 62 72 65 61 6b  STRAINT";  break
0820: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0830: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 7a 4e  E_MISMATCH:   zN
0840: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
0850: 53 4d 41 54 43 48 22 3b 20 20 20 20 62 72 65 61  SMATCH";    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 55 53 45 3a 20 20 20 20 20 7a  TE_MISUSE:     z
0880: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
0890: 49 53 55 53 45 22 3b 20 20 20 20 20 20 62 72 65  ISUSE";      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 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
08c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
08d0: 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 62 72  NOLFS";       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 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
0900: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0910: 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 62  _AUTH";        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 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
0940: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0950: 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20  E_FORMAT";      
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 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
0980: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0990: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
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 4f 57 3a 20 20 20 20   SQLITE_ROW:    
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 4f 57 22 3b 20 20 20 20 20 20 20  ITE_ROW";       
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 44 4f 4e 45 3a 20 20  e SQLITE_DONE:  
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 44 4f 4e 45 22 3b 20 20 20 20 20  LITE_DONE";     
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 4e 4f 54 41 44 42  se SQLITE_NOTADB
0a40: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
0a50: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
0a60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
0a70: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
0a80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0a90: 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22 3b  SQLITE_Unknown";
0aa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
0ab0: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
0ac0: 7d 0a 23 64 65 66 69 6e 65 20 65 72 72 6f 72 4e  }.#define errorN
0ad0: 61 6d 65 20 73 71 6c 69 74 65 33 54 65 73 74 45  ame sqlite3TestE
0ae0: 72 72 6f 72 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a 20  rrorName../*.** 
0af0: 43 6f 6e 76 65 72 74 20 61 6e 20 73 71 6c 69 74  Convert an sqlit
0b00: 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f 20 61 6e  e3_stmt* into an
0b10: 20 73 71 6c 69 74 65 33 2a 2e 20 20 54 68 69 73   sqlite3*.  This
0b20: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 0a   depends on the.
0b30: 2a 2a 20 66 61 63 74 20 74 68 61 74 20 74 68 65  ** fact that the
0b40: 20 73 71 6c 69 74 65 33 2a 20 69 73 20 74 68 65   sqlite3* is the
0b50: 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 6e 20   first field in 
0b60: 74 68 65 20 56 64 62 65 20 73 74 72 75 63 74 75  the Vdbe structu
0b70: 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  re..*/.#define S
0b80: 74 6d 74 54 6f 44 62 28 58 29 20 20 20 28 28 58  tmtToDb(X)   ((X
0b90: 29 3f 2a 28 73 71 6c 69 74 65 33 2a 2a 29 28 58  )?*(sqlite3**)(X
0ba0: 29 3a 30 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ):0)../*.** Chec
0bb0: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0bc0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0bd0: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0be0: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0bf0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0c00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0c10: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0c20: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0c30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0c40: 20 72 63 29 7b 0a 20 20 69 66 28 20 72 63 21 3d   rc){.  if( rc!=
0c50: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26  SQLITE_MISUSE &&
0c60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
0c70: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
0c80: 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20  e(db)!=rc ){.   
0c90: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
0ca0: 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71  .    int r2 = sq
0cb0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
0cc0: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
0cd0: 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f 64 65  Buf, "error code
0ce0: 20 25 73 20 28 25 64 29 20 64 6f 65 73 20 6e 6f   %s (%d) does no
0cf0: 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65 33 5f  t match sqlite3_
0d00: 65 72 72 63 6f 64 65 20 25 73 20 28 25 64 29 22  errcode %s (%d)"
0d10: 2c 0a 20 20 20 20 20 20 20 65 72 72 6f 72 4e 61  ,.       errorNa
0d20: 6d 65 28 72 63 29 2c 20 72 63 2c 20 65 72 72 6f  me(rc), rc, erro
0d30: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0d40: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0d50: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0d60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0d70: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0d80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0d90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0db0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0dc0: 6e 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74  n sqlite3 object
0dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0de0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0df0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0e00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0e10: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0e20: 7b 0a 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c  {.  *ppDb = (sql
0e30: 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54 65 78  ite3*)sqlite3Tex
0e40: 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65  tToPtr(zA);.  re
0e50: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0e60: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0e70: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0e80: 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74  ite3_stmt object
0e90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0ea0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a  getStmtPointer(.
0eb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0ec0: 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  terp, .  const c
0ed0: 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73  har *zArg,  .  s
0ee0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
0ef0: 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
0f00: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
0f10: 74 2a 29 73 71 6c 69 74 65 33 54 65 78 74 54 6f  t*)sqlite3TextTo
0f20: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
0f30: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
0f40: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f  *.** Decode a po
0f50: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
0f60: 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e  te3_stmt object.
0f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0f80: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 0a 20  etFilePointer(. 
0f90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0fa0: 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  erp, .  const ch
0fb0: 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 4f 73  ar *zArg,  .  Os
0fc0: 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 0a 29 7b  File **ppFile.){
0fd0: 0a 20 20 2a 70 70 46 69 6c 65 20 3d 20 28 4f 73  .  *ppFile = (Os
0fe0: 46 69 6c 65 2a 29 73 71 6c 69 74 65 33 54 65 78  File*)sqlite3Tex
0ff0: 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a 20 20  tToPtr(zArg);.  
1000: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1010: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1020: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
1030: 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e  tation of a poin
1040: 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
1050: 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79  understood.** by
1060: 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e 74 65   the getDbPointe
1070: 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74  r and getVmPoint
1080: 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62 6f 76  er routines abov
1090: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  e..**.** The pro
10a0: 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65  blem is, on some
10b0: 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c 61 72   machines (Solar
10c0: 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20 61 20  is) if you do a 
10d0: 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22  printf with.** "
10e0: 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74  %p" you cannot t
10f0: 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64 20 64  urn around and d
1100: 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68 20 74  o a scanf with t
1110: 68 65 20 73 61 6d 65 20 22 25 70 22 20 61 6e 64  he same "%p" and
1120: 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70 6f 69  .** get your poi
1130: 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f 75 20  nter back.  You 
1140: 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e 64 20  have to prepend 
1150: 61 20 22 30 78 22 20 62 65 66 6f 72 65 20 69 74  a "0x" before it
1160: 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20   will.** work.  
1170: 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68 61 74  Or at least that
1180: 20 69 73 20 77 68 61 74 20 69 73 20 72 65 70 6f   is what is repo
1190: 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72 68 29  rted to me (drh)
11a0: 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a 20 62  .  But this.** b
11b0: 65 68 61 76 69 6f 72 20 76 61 72 69 65 73 20 66  ehavior varies f
11c0: 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d  rom machine to m
11d0: 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c  achine.  The sol
11e0: 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72 20 69  ution used her i
11f0: 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  s.** to test the
1200: 20 73 74 72 69 6e 67 20 72 69 67 68 74 20 61 66   string right af
1210: 74 65 72 20 69 74 20 69 73 20 67 65 6e 65 72 61  ter it is genera
1220: 74 65 64 20 74 6f 20 73 65 65 20 69 66 20 69 74  ted to see if it
1230: 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72   can be.** under
1240: 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66 2c 20  stood by scanf, 
1250: 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72 79 20  and if not, try 
1260: 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20 22 30  prepending an "0
1270: 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  x" to see if.** 
1280: 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49 66 20  that helps.  If 
1290: 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61  nothing works, a
12a0: 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 73 20   fatal error is 
12b0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74  generated..*/.st
12c0: 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 50 6f 69  atic int makePoi
12d0: 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
12e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72  rp *interp, char
12f0: 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29   *zPtr, void *p)
1300: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
1310: 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20  intf(100, zPtr, 
1320: 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75  "%p", p);.  retu
1330: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1340: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
1350: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c   routine for sql
1360: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1370: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1380: 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  t exec_printf_cb
1390: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
13a0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
13b0: 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29  gv, char **name)
13c0: 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  {.  Tcl_DString 
13d0: 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72  *str = (Tcl_DStr
13e0: 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ing*)pArg;.  int
13f0: 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44   i;..  if( Tcl_D
1400: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72  StringLength(str
1410: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )==0 ){.    for(
1420: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1430: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
1440: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1450: 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f  t(str, name[i] ?
1460: 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c   name[i] : "NULL
1470: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1480: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1490: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
14a0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
14b0: 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d  ent(str, argv[i]
14c0: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55   ? argv[i] : "NU
14d0: 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LL");.  }.  retu
14e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn 0;.}../*.** U
14f0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
1500: 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20 20  xec_printf  DB  
1510: 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a 2a  FORMAT  STRING.*
1520: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
1530: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
1540: 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20  ntf() interface 
1550: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
1560: 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20  atabase.** DB.  
1570: 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73  The SQL is the s
1580: 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54  tring FORMAT.  T
1590: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
15a0: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
15b0: 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e  ** one %s or %q.
15c0: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20    STRING is the 
15d0: 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69  value inserted i
15e0: 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f  nto %s or %q..*/
15f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1600: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20  _exec_printf(.  
1610: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
1620: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1630: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1640: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1650: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1660: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1670: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
1680: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1690: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
16a0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
16b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
16c0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
16d0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
16e0: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
16f0: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
1700: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
1710: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
1720: 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  l;.  char zBuf[3
1730: 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  0];.  if( argc!=
1740: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1750: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1760: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1770: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1780: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1790: 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52   " DB FORMAT STR
17a0: 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ING", 0);.    re
17b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17c0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
17d0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
17e0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
17f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1800: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
1810: 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c  it(&str);.  zSql
1820: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1830: 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76  tf(argv[2], argv
1840: 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  [3]);.  rc = sql
1850: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
1860: 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f  ql, exec_printf_
1870: 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29  cb, &str, &zErr)
1880: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1890: 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74  (zSql);.  sprint
18a0: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  f(zBuf, "%d", rc
18b0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
18c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
18d0: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
18e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
18f0: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
1900: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
1910: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
1920: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
1930: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
1940: 20 7a 45 72 72 20 29 20 66 72 65 65 28 7a 45 72   zErr ) free(zEr
1950: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
1960: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1970: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1980: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1990: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
19a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19b0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
19c0: 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41 52  tf_z_test  SEPAR
19d0: 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47 31  ATOR  ARG0  ARG1
19e0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20   ....**.** Test 
19f0: 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66  the %z format of
1a00: 20 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65   mprintf().  Use
1a10: 20 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74   multiple mprint
1a20: 66 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  f() calls to .**
1a30: 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67   concatenate arg
1a40: 30 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75  0 through argn u
1a50: 73 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61  sing separator a
1a60: 73 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e  s the separator.
1a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1a80: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
1a90: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
1aa0: 66 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_z(.  void *Not
1ab0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
1ac0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1ad0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1ae0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1af0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1b00: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b20: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1b30: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
1b40: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
1b50: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
1b60: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
1b70: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20  char *zResult = 
1b80: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  0;.  int i;..  f
1b90: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20  or(i=2; i<argc; 
1ba0: 69 2b 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c  i++){.    zResul
1bb0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1bc0: 74 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65  tf("%z%s%s", zRe
1bd0: 73 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61  sult, argv[1], a
1be0: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54  rgv[i]);.  }.  T
1bf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c00: 69 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c  interp, zResult,
1c10: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
1c20: 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  e(zResult);.  re
1c30: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c40: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1c50: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
1c60: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
1c70: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
1c80: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
1c90: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
1ca0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1cb0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1cc0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1cd0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1ce0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1cf0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1d00: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1d10: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1d20: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1d30: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1d40: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1d50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d60: 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
1d70: 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tf(.  void *NotU
1d80: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
1d90: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1da0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1db0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1dc0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1dd0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
1de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1df0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1e00: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
1e10: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
1e20: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
1e30: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
1e40: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63  qlite3 *db;.  Tc
1e50: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
1e60: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
1e70: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74  *zErr = 0;.  int
1e80: 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63   nRow, nCol;.  c
1e90: 68 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20  har **aResult;. 
1ea0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a   int i;.  char z
1eb0: 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20  Buf[30];.  char 
1ec0: 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 61 72 67  *zSql;.  if( arg
1ed0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1ee0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ef0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1f00: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1f10: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1f20: 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20      " DB FORMAT 
1f30: 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20  STRING", 0);.   
1f40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f50: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f60: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f70: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1f80: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f90: 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  OR;.  Tcl_DStrin
1fa0: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a  gInit(&str);.  z
1fb0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1fc0: 72 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72  rintf(argv[2],ar
1fd0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
1fe0: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
1ff0: 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73  (db, zSql, &aRes
2000: 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f  ult, &nRow, &nCo
2010: 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c  l, &zErr);.  sql
2020: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2030: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
2040: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
2050: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
2060: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
2070: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2080: 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  OK ){.    sprint
2090: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52  f(zBuf, "%d", nR
20a0: 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ow);.    Tcl_App
20b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
20c0: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 73 70  p, zBuf);.    sp
20d0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
20e0: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 54 63 6c  , nCol);.    Tcl
20f0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
2100: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
2110: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 52    for(i=0; i<(nR
2120: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69 2b 2b 29  ow+1)*nCol; i++)
2130: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
2140: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2150: 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20 61  , aResult[i] ? a
2160: 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55 4c  Result[i] : "NUL
2170: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  L");.    }.  }el
2180: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  se{.    Tcl_Appe
2190: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
21a0: 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  , zErr);.  }.  s
21b0: 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c  qlite3_free_tabl
21c0: 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69 66  e(aResult);.  if
21d0: 28 20 7a 45 72 72 20 29 20 66 72 65 65 28 7a 45  ( zErr ) free(zE
21e0: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
21f0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
2200: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
2210: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2220: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2230: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
2240: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73  ge:  sqlite3_las
2250: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44  t_insert_rowid D
2260: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
2270: 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49  the integer ROWI
2280: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
2290: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a  cent insert..*/.
22a0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
22b0: 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f  last_rowid(.  vo
22c0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
22d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22e0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
22f0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2300: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2310: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2320: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2330: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2340: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2350: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2360: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2370: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2380: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2390: 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
23a0: 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  30];..  if( argc
23b0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
23c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
23e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
23f0: 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c  , argv[0], " DB\
2400: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
2410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2420: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2430: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
2440: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
2450: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2460: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
2470: 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c  %lld", sqlite3_l
2480: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2490: 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70  (db));.  Tcl_App
24a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24b0: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
24c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
24e0: 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44 42 20   sqlite3_key DB 
24f0: 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  KEY.**.** Set th
2500: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
2510: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2520: 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  key(.  void *Not
2530: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2540: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2550: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2560: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2570: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2580: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25b0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
25c0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
25d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
25e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
25f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
2600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
2610: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
2620: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
2630: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2640: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2650: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2660: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
2670: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
2680: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
2690: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
26b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
26c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
26d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26e0: 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76  R;.  zKey = argv
26f0: 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74  [2];.  nKey = st
2700: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64  rlen(zKey);.#ifd
2710: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
2720: 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65  DEC.  sqlite3_ke
2730: 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  y(db, zKey, nKey
2740: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
2750: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2760: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
2770: 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59  te3_rekey DB KEY
2780: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  .**.** Change th
2790: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
27a0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
27b0: 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  rekey(.  void *N
27c0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
27d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
27e0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
27f0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2800: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2810: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2830: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2840: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2850: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2860: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2870: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2880: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2890: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
28a0: 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  y;.  int nKey;. 
28b0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
28c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
28d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
28e0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
28f0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
2900: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
2910: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
2920: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2930: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2940: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2950: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2960: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2970: 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72  ROR;.  zKey = ar
2980: 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20  gv[2];.  nKey = 
2990: 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69  strlen(zKey);.#i
29a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
29b0: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
29c0: 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20  rekey(db, zKey, 
29d0: 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
29e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
29f0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
2a00: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 44 42  sqlite3_close DB
2a10: 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68  .**.** Closes th
2a20: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
2a30: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65  d by sqlite3_ope
2a40: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2a50: 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f   sqlite_test_clo
2a60: 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  se(.  void *NotU
2a70: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
2a80: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2a90: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2aa0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2ab0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2ac0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ae0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2af0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
2b00: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
2b10: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
2b20: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
2b30: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2b40: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
2b50: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
2b60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2b70: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2b80: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2b90: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
2ba0: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
2bb0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2bc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2bd0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2be0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2bf0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2c00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
2c10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
2c20: 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  (db);.  Tcl_SetR
2c30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2c40: 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28  har *)errorName(
2c50: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
2c60: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2c70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  K;.}../*.** Impl
2c80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2c90: 65 20 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66  e x_coalesce() f
2ca0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  unction..** Retu
2cb0: 72 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 67  rn the first arg
2cc0: 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  ument non-NULL a
2cd0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
2ce0: 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75  ic void ifnullFu
2cf0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
2d00: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
2d10: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2d20: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
2d30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
2d40: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
2d50: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
2d60: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
2d70: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
2d80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d90: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
2da0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
2db0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
2dc0: 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20  ]), -1,.        
2dd0: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
2de0: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
2df0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2e00: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
2e10: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61   into which to a
2e20: 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a  ccumulate text..
2e30: 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b  */.struct dstr {
2e40: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
2e50: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
2e60: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65  ed */.  int nUse
2e70: 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73  d;   /* Space us
2e80: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
2e90: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63       /* The spac
2ea0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
2eb0: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
2ec0: 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dstr.*/.static v
2ed0: 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73  oid dstrAppend(s
2ee0: 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63  truct dstr *p, c
2ef0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
2f00: 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e  t divider){.  in
2f10: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  t n = strlen(z);
2f20: 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20  .  if( p->nUsed 
2f30: 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c  + n + 2 > p->nAl
2f40: 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20  loc ){.    char 
2f50: 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41  *zNew;.    p->nA
2f60: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  lloc = p->nAlloc
2f70: 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20  *2 + n + 200;.  
2f80: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    zNew = sqliteR
2f90: 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e  ealloc(p->z, p->
2fa0: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
2fb0: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
2fc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
2fd0: 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  z);.      memset
2fe0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
2ff0: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
3000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a  ;.    }.    p->z
3010: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = zNew;.  }.  i
3020: 66 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d  f( divider && p-
3030: 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20  >nUsed>0 ){.    
3040: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  p->z[p->nUsed++]
3050: 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a   = divider;.  }.
3060: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70    memcpy(&p->z[p
3070: 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31  ->nUsed], z, n+1
3080: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
3090: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   n;.}../*.** Inv
30a0: 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61  oked for each ca
30b0: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69  llback from sqli
30c0: 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73  te3ExecFunc.*/.s
30d0: 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75  tatic int execFu
30e0: 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ncCallback(void 
30f0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
3100: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
3110: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
3120: 20 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70    struct dstr *p
3130: 20 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a   = (struct dstr*
3140: 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b  )pData;.  int i;
3150: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
3160: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
3170: 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( argv[i]==0 ){.
3180: 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64        dstrAppend
3190: 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29  (p, "NULL", ' ')
31a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31b0: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
31c0: 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a   argv[i], ' ');.
31d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
31f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3200: 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78   the x_sqlite_ex
3210: 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ec() function.  
3220: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
3230: 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  kes.** a single 
3240: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74  argument and att
3250: 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65  empts to execute
3260: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61   that argument a
3270: 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54  s SQL code..** T
3280: 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61  his is illegal a
3290: 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68  nd should set th
32a0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
32b0: 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61  flag on the data
32c0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  base..**.** 2004
32d0: 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76  -Jan-07:  We hav
32e0: 65 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74  e changed this t
32f0: 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20  o make it legal 
3300: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
3310: 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77  exec().** from w
3320: 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e  ithin a function
3330: 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20   call.  .** .** 
3340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d  This routine sim
3350: 75 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63  ulates the effec
3360: 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20  t of having two 
3370: 74 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20  threads attempt 
3380: 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61  to.** use the sa
3390: 6d 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  me database at t
33a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f  he same time..*/
33b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
33c0: 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20  ite3ExecFunc(.  
33d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
33e0: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
33f0: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
3400: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
3410: 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72  ){.  struct dstr
3420: 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c   x;.  memset(&x,
3430: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
3440: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28    sqlite3_exec((
3450: 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33  sqlite3*)sqlite3
3460: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
3470: 78 74 29 2c 0a 20 20 20 20 20 20 73 71 6c 69 74  xt),.      sqlit
3480: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
3490: 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65 78  gv[0]),.      ex
34a0: 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20  ecFuncCallback, 
34b0: 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  &x, 0);.  sqlite
34c0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
34d0: 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55  ntext, x.z, x.nU
34e0: 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  sed, SQLITE_TRAN
34f0: 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
3500: 46 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a  Free(x.z);.}../*
3510: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3520: 74 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 66  te_test_create_f
3530: 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a  unction DB.**.**
3540: 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
3550: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
3560: 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76  n API on the giv
3570: 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  en database in o
3580: 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74  rder.** to creat
3590: 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  e a function nam
35a0: 65 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e  ed "x_coalesce".
35b0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
35c0: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68  does the same th
35d0: 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63  ing.** as the "c
35e0: 6f 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f  oalesce" functio
35f0: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
3600: 6e 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73  n also registers
3610: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
3620: 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c  .** named "x_sql
3630: 69 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69  ite_exec" that i
3640: 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65  nvokes sqlite3_e
3650: 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67  xec().  Invoking
3660: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
3670: 2a 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69  ** in this way i
3680: 73 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73  s illegal recurs
3690: 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72  ion and should r
36a0: 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d  aise an SQLITE_M
36b0: 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20  ISUSE error..** 
36c0: 54 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69  The effect is si
36d0: 6d 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20  milar to trying 
36e0: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
36f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
3700: 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  ion from.** two 
3710: 74 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73  threads at the s
3720: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
3730: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
3740: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
3750: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
3760: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
3770: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
3780: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66  reate_function f
3790: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20  unction while a 
37a0: 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67  query is in prog
37b0: 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ress in order.**
37c0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c   to test the SQL
37d0: 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63  ITE_MISUSE detec
37e0: 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  tion logic..*/.s
37f0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
3800: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
3810: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3820: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3830: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3840: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3850: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3860: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3870: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3880: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3890: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
38a0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
38b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
38c0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
38d0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
38e0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
38f0: 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20  ;.  extern void 
3900: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
3910: 69 74 65 33 2a 29 3b 0a 0a 20 20 69 66 28 20 61  ite3*);..  if( a
3920: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
3930: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3940: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3950: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3960: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
3970: 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20 30 29       " DB\"", 0)
3980: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3990: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
39a0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
39b0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
39c0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
39d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
39e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
39f0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63  unction(db, "x_c
3a00: 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53 51  oalesce", -1, SQ
3a10: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20  LITE_ANY, 0, .  
3a20: 20 20 20 20 20 20 69 66 6e 75 6c 6c 46 75 6e 63        ifnullFunc
3a30: 2c 20 30 2c 20 30 29 3b 0a 0a 23 69 66 6e 64 65  , 0, 0);..#ifnde
3a40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
3a50: 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  F16.  /* Use the
3a60: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
3a70: 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41 50 49  function16() API
3a80: 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f   here. Mainly fo
3a90: 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20  r fun, but also 
3aa0: 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74  .  ** because it
3ab0: 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64 20 61   is not tested a
3ac0: 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f  nywhere else. */
3ad0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
3ae0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
3af0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
3b00: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
3b10: 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
3b20: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
3b30: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
3b40: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
3b50: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
3b60: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
3b70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
3b80: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
3b90: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
3ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
3bb0: 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
3bc0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 2c 0a  E_UTF16NATIVE),.
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
3be0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64   SQLITE_UTF16, d
3bf0: 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  b, sqlite3ExecFu
3c00: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nc, 0, 0);.    s
3c10: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
3c20: 70 56 61 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pVal);.  }.#endi
3c30: 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
3c40: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
3c50: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
3c60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3c70: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
3c80: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
3c90: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  errorName(rc), 0
3ca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3cb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  OK;.}../*.** Rou
3cc0: 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65  tines to impleme
3cd0: 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28 29  nt the x_count()
3ce0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
3cf0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
3d00: 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20  struct CountCtx 
3d10: 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74  CountCtx;.struct
3d20: 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e   CountCtx {.  in
3d30: 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76  t n;.};.static v
3d40: 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73 71  oid countStep(sq
3d50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3d60: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
3d70: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3d80: 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74  **argv){.  Count
3d90: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
3da0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
3db0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
3dc0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
3dd0: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
3de0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
3df0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
3e00: 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20  argv[0]) ) && p 
3e10: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
3e20: 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76   }.}   .static v
3e30: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
3e40: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
3e50: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43  t *context){.  C
3e60: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
3e70: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
3e80: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
3e90: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
3ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
3eb0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
3ec0: 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d  p ? p->n : 0);.}
3ed0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
3ee0: 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61  sqlite_test_crea
3ef0: 74 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a  te_aggregate DB.
3f00: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73  **.** Call the s
3f10: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
3f20: 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68  nction API on th
3f30: 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
3f40: 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20   in order.** to 
3f50: 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f  create a functio
3f60: 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74  n named "x_count
3f70: 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ".  This functio
3f80: 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  n does the same 
3f90: 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20  thing.** as the 
3fa0: 22 6d 64 35 73 75 6d 22 20 66 75 6e 63 74 69 6f  "md5sum" functio
3fb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  n..**.** The ori
3fc0: 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e  ginal motivation
3fd0: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
3fe0: 65 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65  e was to be able
3ff0: 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20   to call the.** 
4000: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61  sqlite3_create_a
4010: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
4020: 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20  n while a query 
4030: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69  is in progress i
4040: 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65  n order.** to te
4050: 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  st the SQLITE_MI
4060: 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c  SUSE detection l
4070: 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ogic..*/.static 
4080: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
4090: 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69  aggregate(.  voi
40a0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
40b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
40c0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
40d0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
40e0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
40f0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
4100: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4110: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4120: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4130: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4140: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4150: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4160: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
4170: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
4180: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
4190: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
41a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
41b0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
41c0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
41d0: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
41e0: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
41f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4200: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
4210: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
4220: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4230: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4240: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
4250: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
4260: 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c  n(db, "x_count",
4270: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
4280: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 63 6f 75   0, 0,.      cou
4290: 6e 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e 61  ntStep,countFina
42a0: 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  lize);.  if( rc=
42b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
42c0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
42d0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
42e0: 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49  _count", 1, SQLI
42f0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20  TE_UTF8, 0, 0,. 
4300: 20 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65 70         countStep
4310: 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b  ,countFinalize);
4320: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
4330: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
4340: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
4350: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4360: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
4370: 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  K;.}..../*.** Us
4380: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
4390: 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54  rintf_int FORMAT
43a0: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
43b0: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43   INTEGER.**.** C
43c0: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
43d0: 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61   three integer a
43e0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
43f0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
4400: 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f  printf_int(.  vo
4410: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4420: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4430: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4440: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4450: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4460: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
4470: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4490: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
44a0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
44b0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
44c0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
44d0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c  /.){.  int a[3],
44e0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
44f0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
4500: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4520: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4530: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4540: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
4550: 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c  MAT INT INT INT\
4560: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4580: 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35  }.  for(i=2; i<5
4590: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
45a0: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
45b0: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
45c0: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
45d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
45e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
45f0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
4600: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
4610: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4620: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
4630: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4640: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
4650: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
4660: 20 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73   zNum represents
4670: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
4680: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 36 34 2d   will fit in 64-
4690: 62 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a  bits, then set.*
46a0: 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61  * *pValue to tha
46b0: 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65  t integer and re
46c0: 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65  turn true.  Othe
46d0: 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c  rwise return fal
46e0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
46f0: 74 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36  t sqlite3GetInt6
4700: 34 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  4(const char *zN
4710: 75 6d 2c 20 69 36 34 20 2a 70 56 61 6c 75 65 29  um, i64 *pValue)
4720: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  {.  if( sqlite3F
4730: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 4e 75 6d  itsIn64Bits(zNum
4740: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4750: 61 74 6f 69 36 34 28 7a 4e 75 6d 2c 20 70 56 61  atoi64(zNum, pVa
4760: 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  lue);.    return
4770: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4780: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61   0;.}../*.** Usa
4790: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
47a0: 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41  intf_int64 FORMA
47b0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
47c0: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
47d0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
47e0: 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69  h three 64-bit i
47f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
4800: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4810: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
4820: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  nt64(.  void *No
4830: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4840: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4850: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4860: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4870: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4880: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
48a0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
48b0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
48c0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
48d0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48e0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
48f0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4900: 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63  _int64 a[3];.  c
4910: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
4920: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
4930: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4940: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4950: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4960: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4970: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
4980: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
4990: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
49a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
49b0: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
49c0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
49d0: 33 47 65 74 49 6e 74 36 34 28 61 72 67 76 5b 69  3GetInt64(argv[i
49e0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a 20  ], &a[i-2]) ){. 
49f0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
4a00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
4a10: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  rgument is not a
4a20: 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e   valid 64-bit in
4a30: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
4a40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4a50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
4a60: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
4a70: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
4a80: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
4a90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4aa0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
4ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4ac0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
4ad0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
4ae0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
4af0: 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41  printf_str FORMA
4b00: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
4b10: 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  R STRING.**.** C
4b20: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
4b30: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
4b40: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73  uments and one s
4b50: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a  tring argument.*
4b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
4b70: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
4b80: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4b90: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4ba0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4bb0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4bc0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4bd0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4be0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4c00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4c10: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4c30: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4c40: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
4c50: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72   a[3], i;.  char
4c60: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
4c70: 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20  4 || argc>5 ){. 
4c80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4c90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4ca0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4cb0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4cc0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
4cd0: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
4ce0: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
4cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4d00: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
4d10: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
4d20: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
4d30: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
4d40: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
4d50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4d60: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
4d70: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
4d80: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
4d90: 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e  >4 ? argv[4] : N
4da0: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
4db0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4dc0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
4dd0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
4de0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4df0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4e00: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
4e10: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
4e20: 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a  INTEGER DOUBLE.*
4e30: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
4e40: 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67  f with two integ
4e50: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  er arguments and
4e60: 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75   one double argu
4e70: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ment.*/.static i
4e80: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
4e90: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
4ea0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4eb0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4ec0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4ed0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4ee0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4ef0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
4f00: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4f10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4f20: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4f30: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4f40: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4f50: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4f60: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
4f70: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
4f80: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
4f90: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
4fa0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4fb0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4fc0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4fd0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
4fe0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
4ff0: 4e 54 20 49 4e 54 20 53 54 52 49 4e 47 5c 22 22  NT INT STRING\""
5000: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
5010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
5020: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
5030: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
5040: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
5050: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
5060: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
5070: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
5080: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
5090: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
50a0: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
50b0: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
50c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
50d0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
50e0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
50f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5100: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
5110: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
5120: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5130: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5140: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
5150: 72 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20  r FORMAT DOUBLE 
5160: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
5170: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61  l mprintf with a
5180: 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61   single double a
5190: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
51a0: 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20   the product of 
51b0: 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d  the.** two argum
51c0: 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65  ents given above
51d0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
51e0: 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72  to generate over
51f0: 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c  flow and underfl
5200: 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f  ow.** doubles to
5210: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20   test that they 
5220: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72  are converted pr
5230: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  operly..*/.stati
5240: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
5250: 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20  rintf_scaled(.  
5260: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
5270: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5280: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
5290: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
52a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
52b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
52c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
52d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
52e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
52f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5300: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
5310: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5320: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5330: 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20    double r[2];. 
5340: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
5350: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
5360: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5370: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
5380: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
5390: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
53a0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44        " FORMAT D
53b0: 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c  OUBLE DOUBLE\"",
53c0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
53d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
53e0: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
53f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
5400: 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72  _GetDouble(inter
5410: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69  p, argv[i], &r[i
5420: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
5430: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
5440: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
5450: 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d  tf(argv[1], r[0]
5460: 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70  *r[1]);.  Tcl_Ap
5470: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5480: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
5490: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
54a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
54b0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
54c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
54d0: 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54  tronly FORMAT ST
54e0: 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  RING.**.** Call 
54f0: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73  mprintf with a s
5500: 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67  ingle double arg
5510: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74  ument which is t
5520: 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68  he product of th
5530: 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e  e.** two argumen
5540: 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20  ts given above. 
5550: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
5560: 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c   generate overfl
5570: 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77  ow and underflow
5580: 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74  .** doubles to t
5590: 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72  est that they ar
55a0: 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70  e converted prop
55b0: 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erly..*/.static 
55c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
55d0: 6e 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76  ntf_stronly(.  v
55e0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
55f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5600: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
5610: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
5620: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
5630: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
5640: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
5650: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5660: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5670: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
5680: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
5690: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
56a0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
56b0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
56c0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
56d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
56e0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
56f0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
5700: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
5710: 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c  ORMAT STRING\"",
5720: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5730: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5740: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
5750: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72  intf(argv[1], ar
5760: 67 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70  gv[2]);.  Tcl_Ap
5770: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5780: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
5790: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
57a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
57b0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
57c0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
57d0: 20 4e 20 20 3f 52 45 50 45 41 54 2d 49 4e 54 45   N  ?REPEAT-INTE
57e0: 52 56 41 4c 3f 0a 2a 2a 0a 2a 2a 20 52 69 67 20  RVAL?.**.** Rig 
57f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 74  sqliteMalloc() t
5800: 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 4e 2d  o fail on the N-
5810: 74 68 20 63 61 6c 6c 20 61 6e 64 20 65 76 65 72  th call and ever
5820: 79 20 52 45 50 45 41 54 2d 49 4e 54 45 52 56 41  y REPEAT-INTERVA
5830: 4c 20 63 61 6c 6c 0a 2a 2a 20 61 66 74 65 72 20  L call.** after 
5840: 74 68 61 74 2e 20 20 49 66 20 52 45 50 45 41 54  that.  If REPEAT
5850: 2d 49 4e 54 45 52 56 41 4c 20 69 73 20 30 20 6f  -INTERVAL is 0 o
5860: 72 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  r is omitted, th
5870: 65 6e 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  en only a single
5880: 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 77 69 6c 6c 20  .** malloc will 
5890: 66 61 69 6c 2e 20 20 49 66 20 52 45 50 45 41 54  fail.  If REPEAT
58a0: 2d 49 4e 54 45 52 56 41 4c 20 69 73 20 31 20 74  -INTERVAL is 1 t
58b0: 68 65 6e 20 61 6c 6c 20 6d 61 6c 6c 6f 63 73 20  hen all mallocs 
58c0: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 66 69 72  after the.** fir
58d0: 73 74 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  st failure will 
58e0: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 66 61 69 6c  continue to fail
58f0: 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e 20   on every call. 
5900: 20 49 66 20 52 45 50 45 41 54 2d 49 4e 54 45 52   If REPEAT-INTER
5910: 56 41 4c 20 69 73 0a 2a 2a 20 32 20 74 68 65 6e  VAL is.** 2 then
5920: 20 65 76 65 72 79 20 6f 74 68 65 72 20 6d 61 6c   every other mal
5930: 6c 6f 63 20 77 69 6c 6c 20 66 61 69 6c 2e 20 20  loc will fail.  
5940: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
5950: 0a 2a 2a 20 54 75 72 6e 20 6f 66 66 20 74 68 69  .** Turn off thi
5960: 73 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20  s mechanism and 
5970: 72 65 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  reset the sqlite
5980: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
5990: 76 61 72 69 61 62 6c 65 20 69 73 20 4e 3d 3d 30  variable is N==0
59a0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
59b0: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 73 74 61 74  TE_MEMDEBUG.stat
59c0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61  ic int sqlite_ma
59d0: 6c 6c 6f 63 5f 66 61 69 6c 28 0a 20 20 76 6f 69  lloc_fail(.  voi
59e0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
59f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5a00: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
5a10: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
5a20: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
5a30: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
5a40: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
5a50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
5a60: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
5a70: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
5a80: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
5a90: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
5aa0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  .){.  int n;.  i
5ab0: 6e 74 20 72 65 70 3b 0a 20 20 69 66 28 20 61 72  nt rep;.  if( ar
5ac0: 67 63 21 3d 32 20 26 26 20 61 72 67 63 21 3d 33  gc!=2 && argc!=3
5ad0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5ae0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5af0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
5b00: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
5b10: 72 67 76 5b 30 5d 2c 20 22 20 4e 5c 22 22 2c 20  rgv[0], " N\"", 
5b20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5b30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5b40: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
5b50: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
5b60: 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
5b70: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 61 72  _ERROR;.  if( ar
5b80: 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 69 66 28  gc==3 ){.    if(
5b90: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
5ba0: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 72 65  rp, argv[2], &re
5bb0: 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  p) ) return TCL_
5bc0: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
5bd0: 20 20 20 20 72 65 70 20 3d 20 30 3b 0a 20 20 7d      rep = 0;.  }
5be0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c  .  sqlite3_iMall
5bf0: 6f 63 46 61 69 6c 20 3d 20 6e 3b 0a 20 20 73 71  ocFail = n;.  sq
5c00: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 52 65 73  lite3_iMallocRes
5c10: 65 74 20 3d 20 72 65 70 3b 0a 20 20 73 71 6c 69  et = rep;.  sqli
5c20: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
5c30: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
5c40: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
5c50: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
5c60: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61  qlite_malloc_sta
5c70: 74 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  t.**.** Return t
5c80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69  he number of pri
5c90: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  or calls to sqli
5ca0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 73  teMalloc() and s
5cb0: 71 6c 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  qliteFree()..*/.
5cc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  #ifdef SQLITE_ME
5cd0: 4d 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  MDEBUG.static in
5ce0: 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  t sqlite_malloc_
5cf0: 73 74 61 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  stat(.  void *No
5d00: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
5d10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
5d20: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
5d30: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
5d40: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5d50: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d70: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
5d80: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
5d90: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
5da0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
5db0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
5dc0: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
5dd0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
5de0: 20 22 25 64 20 25 64 20 25 64 22 2c 20 73 71 6c   "%d %d %d", sql
5df0: 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2c 20 73 71  ite3_nMalloc, sq
5e00: 6c 69 74 65 33 5f 6e 46 72 65 65 2c 20 73 71 6c  lite3_nFree, sql
5e10: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
5e20: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
5e30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
5e40: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
5e50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
5e60: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
5e70: 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a   sqlite_abort.**
5e80: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
5e90: 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61   process immedia
5ea0: 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e  tely.  This is n
5eb0: 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64  ot a clean shutd
5ec0: 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d  own..** This com
5ed0: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
5ee0: 74 65 73 74 20 74 68 65 20 72 65 63 6f 76 65 72  test the recover
5ef0: 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74  ability of a dat
5f00: 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20  abase in.** the 
5f10: 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72  event of a progr
5f20: 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61  am crash..*/.sta
5f30: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 61  tic int sqlite_a
5f40: 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  bort(.  void *No
5f50: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
5f60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
5f70: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
5f80: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
5f90: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5fa0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5fc0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
5fd0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
5fe0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
5ff0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
6000: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
6010: 20 61 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d   assert( interp=
6020: 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20  =0 );   /* This 
6030: 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c  will always fail
6040: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
6050: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
6060: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
6070: 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64 65  ine is a user-de
6080: 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69  fined SQL functi
6090: 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65  on whose purpose
60a0: 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74  .** is to test t
60b0: 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65  he sqlite_set_re
60c0: 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73  sult() API..*/.s
60d0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 46  tatic void testF
60e0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
60f0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
6100: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
6110: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
6120: 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20   while( argc>=2 
6130: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
6140: 72 20 2a 7a 41 72 67 30 20 3d 20 73 71 6c 69 74  r *zArg0 = sqlit
6150: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6160: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[0]);.    if( 
6170: 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69  zArg0 ){.      i
6180: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
6190: 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74  ICmp(zArg0, "int
61a0: 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ") ){.        sq
61b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
61c0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
61d0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
61e0: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
61f0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
6200: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74  rICmp(zArg0,"int
6210: 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  64")==0 ){.     
6220: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6230: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
6240: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6250: 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a  nt64(argv[1]));.
6260: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6270: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
6280: 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d  Arg0,"string")==
6290: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
62a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
62b0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
62c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
62d0: 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20  v[1]), -1,.     
62e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
62f0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
6300: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
6310: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
6320: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
6330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
6340: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
6350: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
6360: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
6370: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
6380: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
6390: 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c  ICmp(zArg0,"null
63a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
63b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
63c0: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
63d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
63e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
63f0: 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20  rg0,"value")==0 
6400: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6410: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
6420: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71  context, argv[sq
6430: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
6440: 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20  argv[1])]);.    
6450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6460: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
6470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6480: 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  se{.      goto e
6490: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
64a0: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
64b0: 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
64c0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72  }.  return;..err
64d0: 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
64e0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
64f0: 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61 72  ontext,"first ar
6500: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
6510: 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
6520: 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69   "int int64 stri
6530: 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76  ng double null v
6540: 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f  alue", -1);.}../
6550: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
6560: 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
6570: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20  st_function  DB 
6580: 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69   NAME.**.** Regi
6590: 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53 51  ster the test SQ
65a0: 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  L function on th
65b0: 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75 6e  e database DB un
65c0: 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d  der the name NAM
65d0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
65e0: 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66   test_register_f
65f0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
6600: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
6610: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
6620: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
6630: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
6640: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
6650: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
6660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6670: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
6680: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
6690: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
66a0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
66b0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
66c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
66d0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67  nt rc;.  if( arg
66e0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
66f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6700: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
6710: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
6720: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
6730: 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f      " DB FUNCTIO
6740: 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20  N-NAME", 0);.   
6750: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6760: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
6770: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
6780: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
6790: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
67a0: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
67b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
67c0: 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
67d0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
67e0: 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46   0, .      testF
67f0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
6800: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54  ( rc!=0 ){.    T
6810: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6820: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
6830: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
6840: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6850: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ROR;.  }.  if( s
6860: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
6870: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
6880: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
6890: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
68a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
68b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
68c0: 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a  finalize  STMT .
68d0: 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  **.** Finalize a
68e0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
68f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6900: 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a   test_finalize(.
6910: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
6920: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
6930: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
6940: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
6950: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
6960: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
6970: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
6980: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
6990: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
69a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
69b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
69c0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
69d0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
69e0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
69f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
6a00: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
6a10: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
6a20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6a30: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
6a40: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
6a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
6a60: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
6a70: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6a80: 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  OR;..  if( pStmt
6a90: 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d   ){.    db = Stm
6aa0: 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20  tToDb(pStmt);.  
6ab0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
6ac0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
6ad0: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
6ae0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
6af0: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  *)errorName(rc),
6b00: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
6b10: 69 66 28 20 64 62 20 26 26 20 73 71 6c 69 74 65  if( db && sqlite
6b20: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
6b30: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
6b40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6b50: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
6b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
6b70: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
6b80: 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69    STMT .**.** Fi
6b90: 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65  nalize a stateme
6ba0: 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  nt handle..*/.st
6bb0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65  atic int test_re
6bc0: 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  set(.  void * cl
6bd0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
6be0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
6bf0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
6c00: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
6c10: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
6c20: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
6c30: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
6c40: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
6c50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6c60: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
6c70: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
6c80: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
6c90: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6ca0: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
6cb0: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
6cc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6cd0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
6ce0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
6cf0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
6d00: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
6d10: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
6d20: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
6d30: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6d40: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53  pStmt);.  if( pS
6d50: 74 6d 74 20 26 26 20 0a 20 20 20 20 20 20 73 71  tmt && .      sq
6d60: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
6d70: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
6d80: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
6d90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6da0: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
6db0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
6dc0: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  *)errorName(rc),
6dd0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
6de0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
6df0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6e00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
6e10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
6e20: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
6e30: 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a  pired STMT .**.*
6e40: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
6e50: 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e   a recompilation
6e60: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
6e70: 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
6e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6e90: 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20  test_expired(.  
6ea0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
6eb0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
6ec0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
6ed0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
6ee0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
6ef0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6f00: 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  pStmt;.  if( obj
6f10: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
6f20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6f30: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
6f40: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
6f50: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
6f60: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6f70: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
6f80: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
6f90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6fa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
6fb0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
6fc0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
6fd0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
6fe0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
6ff0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
7000: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
7010: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
7020: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69  Obj(sqlite3_expi
7030: 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  red(pStmt)));.  
7040: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7050: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
7060: 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72  sqlite3_transfer
7070: 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53 54  _bindings FROMST
7080: 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  MT TOSTMT.**.** 
7090: 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69 6e  Transfer all bin
70a0: 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d 53  dings from FROMS
70b0: 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53 54  TMT over to TOST
70c0: 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  MT.*/.static int
70d0: 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62   test_transfer_b
70e0: 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ind(.  void * cl
70f0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
7100: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
7110: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
7120: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
7130: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
7140: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a  _stmt *pStmt1, *
7150: 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62  pStmt2;.  if( ob
7160: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
7170: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7180: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
7190: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
71a0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
71b0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
71c0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
71d0: 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d  FROM-STMT TO-STM
71e0: 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
71f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7200: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
7210: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
7220: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
7230: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29  v[1]), &pStmt1))
7240: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7250: 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  R;.  if( getStmt
7260: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
7270: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
7280: 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29  jv[2]), &pStmt2)
7290: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
72a0: 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
72b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
72c0: 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
72d0: 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  bj(sqlite3_trans
72e0: 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  fer_bindings(pSt
72f0: 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 20  mt1,pStmt2)));. 
7300: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7310: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
7320: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
7330: 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
7340: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7350: 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
7360: 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  he database by t
7370: 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65  he last SQL.** e
7380: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  xecution..*/.sta
7390: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68 61  tic int test_cha
73a0: 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  nges(.  void * c
73b0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
73c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
73d0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
73e0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
73f0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
7400: 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a  3 *db;.  if( obj
7410: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
7420: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7430: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
7440: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
7450: 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ",.       Tcl_Ge
7460: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
7470: 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
7480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7490: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
74a0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
74b0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
74c0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
74d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
74e0: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
74f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
7500: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
7510: 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29  te3_changes(db))
7520: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
7530: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
7540: 73 20 69 73 20 74 68 65 20 22 73 74 61 74 69 63  s is the "static
7550: 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61  _bind_value" tha
7560: 74 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  t variables are 
7570: 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a  bound to when.**
7580: 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e   the FLAG option
7590: 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   of sqlite3_bind
75a0: 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a   is "static".*/.
75b0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c  static char *sql
75c0: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
75d0: 76 61 6c 75 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  value = 0;../*.*
75e0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
75f0: 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20  3_bind  VM  IDX 
7600: 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a   VALUE  FLAGS.**
7610: 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c  .** Sets the val
7620: 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68  ue of the IDX-th
7630: 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 22 3f   occurance of "?
7640: 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  " in the origina
7650: 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e  l SQL.** string.
7660: 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20 6e    VALUE is the n
7670: 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46 4c  ew value.  If FL
7680: 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e  AGS=="null" then
7690: 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e   VALUE is.** ign
76a0: 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  ored and the val
76b0: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
76c0: 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73  L.  If FLAGS=="s
76d0: 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74  tatic" then.** t
76e0: 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
76f0: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
7700: 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  a static variabl
7710: 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69  e named.** "sqli
7720: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
7730: 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47 53  alue".  If FLAGS
7740: 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20  =="normal" then 
7750: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
7760: 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e 0a   VALUE is made..
7770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
7780: 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20  st_bind(.  void 
7790: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
77a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
77b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
77c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
77d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
77e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
77f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
7800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
7810: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
7820: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
7830: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
7840: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
7850: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
7860: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
7870: 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
7880: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
7890: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
78a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
78b0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
78c0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
78d0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20  ], .       " VM 
78e0: 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c  IDX VALUE (null|
78f0: 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22  static|normal)\"
7900: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
7910: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7920: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
7930: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
7940: 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29  gv[1], &pStmt) )
7950: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7960: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
7970: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
7980: 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
7990: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
79a0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
79b0: 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29  [4],"null")==0 )
79c0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
79d0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
79e0: 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73  mt, idx);.  }els
79f0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
7a00: 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d  v[4],"static")==
7a10: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
7a20: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
7a30: 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69  pStmt, idx, sqli
7a40: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
7a50: 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  alue, -1, 0);.  
7a60: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
7a70: 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c  (argv[4],"normal
7a80: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
7a90: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
7aa0: 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
7ab0: 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c  argv[3], -1, SQL
7ac0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
7ad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
7ae0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7af0: 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d  terp, "4th argum
7b00: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  ent should be ".
7b10: 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c          "\"null\
7b20: 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20  " or \"static\" 
7b30: 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20  or \"normal\"", 
7b40: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
7b50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
7b60: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
7b70: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
7b80: 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
7b90: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
7ba0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
7bb0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
7bc0: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  f[50];.    sprin
7bd0: 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
7be0: 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
7bf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7c00: 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
7c10: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
7c20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7c30: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
7c40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
7c50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7c60: 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55  IT_UTF16./*.** U
7c70: 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
7c80: 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
7c90: 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
7ca0: 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
7cb0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7cc0: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
7cd0: 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
7ce0: 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
7cf0: 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
7d00: 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
7d10: 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
7d20: 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
7d30: 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
7d40: 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
7d50: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
7d60: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
7d70: 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
7d80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7d90: 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
7da0: 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
7db0: 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
7dc0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7dd0: 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
7de0: 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
7df0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
7e00: 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
7e10: 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
7e20: 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
7e30: 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
7e40: 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
7e50: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
7e60: 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
7e70: 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
7e80: 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
7e90: 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
7ea0: 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
7eb0: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
7ec0: 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
7ed0: 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
7ee0: 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
7ef0: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
7f00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
7f10: 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
7f20: 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
7f30: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
7f40: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
7f50: 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
7f60: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
7f70: 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
7f80: 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
7f90: 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
7fa0: 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
7fb0: 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
7fc0: 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
7fd0: 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
7fe0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
7ff0: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
8000: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
8010: 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
8020: 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
8030: 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
8040: 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
8050: 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
8060: 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
8070: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
8080: 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
8090: 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70  k with one intep
80a0: 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
80b0: 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
80c0: 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
80d0: 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
80e0: 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
80f0: 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
8100: 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
8110: 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
8120: 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
8130: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
8140: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
8150: 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
8160: 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
8170: 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
8180: 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
8190: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
81a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
81b0: 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
81c0: 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
81d0: 69 6e 20 3d 20 28 69 6e 74 29 70 43 74 78 3b 0a  in = (int)pCtx;.
81e0: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 73 71    int res;..  sq
81f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
8200: 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  l;.  Tcl_Obj *pX
8210: 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  ;..  pX = Tcl_Ne
8220: 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
8230: 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a  _collate", -1);.
8240: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
8250: 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63  nt(pX);..  switc
8260: 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20  h( encin ){.    
8270: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38  case SQLITE_UTF8
8280: 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
8290: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
82a0: 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
82b0: 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d  ingObj("UTF-8",-
82c0: 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
82d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
82e0: 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
82f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8300: 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
8310: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8320: 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b  "UTF-16LE",-1));
8330: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8340: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
8350: 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16BE:.      Tcl
8360: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8370: 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
8380: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
8390: 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16BE",-1));.   
83a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
83b0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
83c0: 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 70  ert(0);.  }..  p
83d0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
83e0: 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74  ueNew();.  sqlit
83f0: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
8400: 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69  al, nA, zA, enci
8410: 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
8420: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
8430: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
8440: 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
8450: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
8460: 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 29  e_text(pVal),-1)
8470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
8480: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42  eSetStr(pVal, nB
8490: 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zB, encin, SQL
84a0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 54  ITE_STATIC);.  T
84b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
84c0: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
84d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
84e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
84f0: 28 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20 20 73  (pVal),-1));.  s
8500: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
8510: 70 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45 76  pVal);..  Tcl_Ev
8520: 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30  alObjEx(i, pX, 0
8530: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
8540: 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
8550: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
8560: 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
8570: 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20  lt(i), &res);.  
8580: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74  return res;.}.st
8590: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
85a0: 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  llate(.  void * 
85b0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
85c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
85d0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
85e0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
85f0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
8600: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
8610: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l;.  sqlite3_val
8620: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
8630: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
8640: 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =5 ) goto bad_ar
8650: 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61  gs;.  pTestColla
8660: 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  teInterp = inter
8670: 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  p;.  if( getDbPo
8680: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
8690: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
86a0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
86b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
86c0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
86d0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
86e0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
86f0: 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
8700: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8710: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
8720: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
8730: 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
8740: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
8750: 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
8760: 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20   *)SQLITE_UTF8, 
8770: 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
8780: 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20  _func:0);.  if( 
8790: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
87a0: 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
87b0: 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
87c0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
87d0: 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
87e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
87f0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
8800: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
8810: 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f  ion(db, "test_co
8820: 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
8830: 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20  TF16LE, .       
8840: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
8850: 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c  ITE_UTF16LE, val
8860: 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
8870: 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54  nc:0);.    if( T
8880: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
8890: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
88a0: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
88b0: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
88c0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 70 56 61  _ERROR;..    pVa
88d0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
88e0: 4e 65 77 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  New();.    sqlit
88f0: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
8900: 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f  al, -1, "test_co
8910: 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
8920: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
8930: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
8940: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
8950: 6e 31 36 28 64 62 2c 20 73 71 6c 69 74 65 33 56  n16(db, sqlite3V
8960: 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
8970: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
8980: 45 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  E), .          S
8990: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 28  QLITE_UTF16BE, (
89a0: 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
89b0: 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16BE, val?test_
89c0: 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
89d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
89e0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d  eFree(pVal);.  }
89f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
8a00: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
8a10: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
8a20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8a30: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
8a40: 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
8a50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8a60: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8a70: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8a80: 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ",.      Tcl_Get
8a90: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8aa0: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42  jv[0], 0), " <DB
8ab0: 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
8ac0: 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30  e> <utf16be>", 0
8ad0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8ae0: 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63  ERROR;.}..static
8af0: 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61   void test_colla
8b00: 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20  te_needed_cb(.  
8b10: 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73  void *pCtx, .  s
8b20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
8b30: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f  t eTextRep,.  co
8b40: 6e 73 74 20 76 6f 69 64 20 2a 6e 6f 74 55 73 65  nst void *notUse
8b50: 64 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d  d.){.  int enc =
8b60: 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 73 71 6c 69   db->enc;.  sqli
8b70: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
8b80: 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20  tion(.      db, 
8b90: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
8ba0: 64 62 2d 3e 65 6e 63 2c 20 28 76 6f 69 64 20 2a  db->enc, (void *
8bb0: 29 65 6e 63 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  )enc, test_colla
8bc0: 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a  te_func);.}../*.
8bd0: 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
8be0: 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
8bf0: 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d DB.*/.static i
8c00: 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  nt test_collate_
8c10: 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  needed(.  void *
8c20: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
8c30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8c40: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
8c50: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
8c60: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
8c70: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
8c80: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
8c90: 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  2 ) goto bad_arg
8ca0: 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
8cb0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
8cc0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
8cd0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
8ce0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8cf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   rc = sqlite3_co
8d00: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
8d10: 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c  (db, 0, test_col
8d20: 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b  late_needed_cb);
8d30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
8d40: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
8d50: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
8d60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8d70: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
8d80: 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
8d90: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8da0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
8db0: 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  B");.  return TC
8dc0: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 23 65 6e 64 69  L_ERROR;.}.#endi
8dd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8de0: 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
8df0: 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
8e00: 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74  _function <db pt
8e10: 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
8e20: 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
8e30: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8e40: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
8e50: 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
8e60: 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
8e70: 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69  t user.** functi
8e80: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  on callback when
8e90: 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
8ea0: 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
8eb0: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
8ec0: 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
8ed0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
8ee0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
8ef0: 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74  egisters up to t
8f00: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
8f10: 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
8f20: 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63  on.** "test_func
8f30: 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62  tion" with datab
8f40: 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
8f50: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
8f60: 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74  argument is.** t
8f70: 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73  rue, then a vers
8f80: 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63  ion of test_func
8f90: 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  tion is register
8fa0: 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
8fb0: 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73   the.** third is
8fc0: 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e   true, a version
8fd0: 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66   is registered f
8fe0: 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  or UTF-16le, if 
8ff0: 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a  the fourth is.**
9000: 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
9010: 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
9020: 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75  ilable.  Previou
9030: 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a  s versions of.**
9040: 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61   test_function a
9050: 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
9060: 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74  * The user funct
9070: 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
9080: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
9090: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  e following TCL 
90a0: 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
90b0: 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c  "test_function <
90c0: 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a  enc> <arg>".**.*
90d0: 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73  * Where <enc> is
90e0: 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55   one of UTF-8, U
90f0: 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36  TF-16LE or UTF16
9100: 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73  BE, and <arg> is
9110: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61   the.** single a
9120: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
9130: 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  o the SQL functi
9140: 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
9150: 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65  turned by.** the
9160: 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75   TCL script is u
9170: 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72  sed as the retur
9180: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53  n value of the S
9190: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a  QL function. It.
91a0: 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ** is passed to 
91b0: 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46  SQLite using UTF
91c0: 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d  -16BE for a UTF-
91d0: 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  8 test_function(
91e0: 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20  ), UTF-8.** for 
91f0: 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f  a UTF-16LE test_
9200: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20  function(), and 
9210: 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20  UTF-16LE for an 
9220: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
9230: 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55  hat.** prefers U
9240: 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e  TF-16BE..*/.#ifn
9250: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9260: 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69  UTF16.static voi
9270: 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
9280: 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f  utf8(.  sqlite3_
9290: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
92a0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
92b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
92c0: 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
92d0: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
92e0: 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
92f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
9300: 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
9310: 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
9320: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
9330: 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
9340: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
9350: 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
9360: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
9370: 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
9380: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
9390: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
93a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
93b0: 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b  j("UTF-8", -1));
93c0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
93d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
93e0: 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
93f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
9400: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9410: 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
9420: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
9430: 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
9440: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
9450: 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c  Count(pX);.  sql
9460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
9470: 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74  (pCtx, Tcl_GetSt
9480: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
9490: 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  p), -1, SQLITE_T
94a0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61  RANSIENT);.  pVa
94b0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
94c0: 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  New();.  sqlite3
94d0: 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
94e0: 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
94f0: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
9500: 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
9510: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
9520: 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
9530: 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
9540: 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
9550: 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56  alue_text16be(pV
9560: 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
9570: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
9580: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
9590: 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
95a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
95b0: 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28  unction_utf16le(
95c0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
95d0: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
95e0: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
95f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
9600: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9610: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
9620: 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
9630: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
9640: 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
9650: 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
9660: 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
9670: 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
9680: 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
9690: 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
96a0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
96b0: 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
96c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
96d0: 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
96e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
96f0: 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16LE", -1));. 
9700: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
9710: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
9720: 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
9730: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
9740: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
9750: 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
9760: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
9770: 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
9780: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
9790: 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
97a0: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
97b0: 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  w();.  sqlite3Va
97c0: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
97d0: 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
97e0: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
97f0: 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
9800: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
9810: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
9820: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
9830: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9840: 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49  xt(pVal),-1,SQLI
9850: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
9860: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
9870: 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69  e(pVal);.}.stati
9880: 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63  c void test_func
9890: 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20  tion_utf16be(.  
98a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
98b0: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
98c0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
98d0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
98e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
98f0: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
9900: 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
9910: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
9920: 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
9930: 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
9940: 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
9950: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
9960: 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
9970: 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
9980: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
9990: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
99a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
99b0: 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
99c0: 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
99d0: 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  6BE", -1));.  Tc
99e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
99f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
9a00: 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65  X, .      Tcl_Ne
9a10: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
9a20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9a30: 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
9a40: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
9a50: 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
9a60: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
9a70: 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
9a80: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
9a90: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
9aa0: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
9ab0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
9ac0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
9ad0: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
9ae0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
9af0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
9b00: 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78  lt_text16le(pCtx
9b10: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
9b20: 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
9b30: 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
9b40: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
9b50: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
9b60: 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pVal);.}.#endif 
9b70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
9b80: 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 69  TF16 */.static i
9b90: 6e 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  nt test_function
9ba0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
9bb0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
9bc0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
9bd0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
9be0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
9bf0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
9c00: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
9c10: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
9c20: 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  nt val;..  if( o
9c30: 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61  bjc!=5 ) goto ba
9c40: 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65  d_args;.  if( ge
9c50: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
9c60: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
9c70: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
9c80: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9c90: 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f  OR;..  if( TCL_O
9ca0: 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
9cb0: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
9cc0: 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20   objv[2], &val) 
9cd0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9ce0: 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
9cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
9d00: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
9d10: 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
9d20: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
9d30: 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
9d40: 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
9d50: 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20  _utf8, 0, 0);.  
9d60: 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  }.  if( TCL_OK!=
9d70: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
9d80: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
9d90: 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
9da0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9db0: 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
9dc0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
9dd0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
9de0: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
9df0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
9e00: 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
9e10: 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
9e20: 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b  _utf16le, 0, 0);
9e30: 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f  .  }.  if( TCL_O
9e40: 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
9e50: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
9e60: 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20   objv[4], &val) 
9e70: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9e80: 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
9e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
9ea0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
9eb0: 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
9ec0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
9ed0: 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  6BE, .        in
9ee0: 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
9ef0: 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c 20  ion_utf16be, 0, 
9f00: 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
9f10: 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72  n TCL_OK;.bad_ar
9f20: 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
9f30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9f40: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9f50: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
9f60: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
9f70: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
9f80: 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66   0), " <DB> <utf
9f90: 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
9fa0: 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e  f16be>", 0);.#en
9fb0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9fc0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
9fd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
9ff0: 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
a000: 73 74 72 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a  str <err code>.*
a010: 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61 74 20 74  *.** Test that t
a020: 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he english langu
a030: 61 67 65 20 73 74 72 69 6e 67 20 65 71 75 69 76  age string equiv
a040: 61 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c 69 74  alents for sqlit
a050: 65 20 65 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a  e error codes.**
a060: 20 61 72 65 20 73 61 6e 65 2e 20 54 68 65 20 70   are sane. The p
a070: 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 69  arameter is an i
a080: 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74  nteger represent
a090: 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 20 65 72  ing an sqlite er
a0a0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65  ror code..** The
a0b0: 20 72 65 73 75 6c 74 20 69 73 20 61 20 6c 69 73   result is a lis
a0c0: 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74  t of two element
a0d0: 73 2c 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  s, the string re
a0e0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
a0f0: 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  the.** error cod
a100: 65 20 61 6e 64 20 74 68 65 20 65 6e 67 6c 69 73  e and the englis
a110: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
a120: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nation..*/.stati
a130: 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 73 74  c int test_errst
a140: 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  r(.  void * clie
a150: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
a160: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
a170: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
a180: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
a190: 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  ].){.  char *zCo
a1a0: 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  de;.  int i;.  i
a1b0: 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
a1c0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
a1d0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
a1e0: 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64 65  jv, "<error code
a1f0: 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64  >");.  }..  zCod
a200: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
a210: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f  g(objv[1]);.  fo
a220: 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b  r(i=0; i<200; i+
a230: 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
a240: 74 72 63 6d 70 28 65 72 72 6f 72 4e 61 6d 65 28  trcmp(errorName(
a250: 69 29 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65  i), zCode) ) bre
a260: 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  ak;.  }.  Tcl_Se
a270: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
a280: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45  (char *)sqlite3E
a290: 72 72 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20  rrStr(i), 0);.  
a2a0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a2b0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
a2c0: 69 74 65 33 5f 63 72 61 73 68 70 61 72 61 6d 73  ite3_crashparams
a2d0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
a2e0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
a2f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
a300: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
a310: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
a320: 0a 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45  .){.#ifdef OS_TE
a330: 53 54 0a 20 20 69 6e 74 20 64 65 6c 61 79 3b 0a  ST.  int delay;.
a340: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 20    if( objc!=3 ) 
a350: 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
a360: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
a370: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a380: 62 6a 76 5b 31 5d 2c 20 26 64 65 6c 61 79 29 20  bjv[1], &delay) 
a390: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
a3a0: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74  OR;.  sqlite3Set
a3b0: 43 72 61 73 68 50 61 72 61 6d 73 28 64 65 6c 61  CrashParams(dela
a3c0: 79 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  y, Tcl_GetString
a3d0: 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 23 65 6e 64  (objv[2]));.#end
a3e0: 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
a3f0: 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 4f 53 5f 54  OK;..#ifdef OS_T
a400: 45 53 54 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  EST.bad_args:.  
a410: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a420: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a430: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a440: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
a450: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a460: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
a470: 3c 64 65 6c 61 79 3e 20 3c 66 69 6c 65 6e 61 6d  <delay> <filenam
a480: 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  e>", 0);.  retur
a490: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e  n TCL_ERROR;.#en
a4a0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  dif.}.../*.** Us
a4b0: 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69  age:    breakpoi
a4c0: 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  nt.**.** This ro
a4d0: 75 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72  utine exists for
a4e0: 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74   one purpose - t
a4f0: 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63  o provide a plac
a500: 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72  e to put a.** br
a510: 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44  eakpoint with GD
a520: 42 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72  B that can be tr
a530: 69 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43  iggered using TC
a540: 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65  L code.  The use
a550: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20  .** for this is 
a560: 77 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61  when a particula
a570: 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20  r test fails on 
a580: 28 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68  (say) the 1485th
a590: 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   iteration..** I
a5a0: 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73  n the TCL test s
a5b0: 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64  cript, we can ad
a5c0: 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73  d code like this
a5d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b  :.**.**     if {
a5e0: 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70  $i==1485} breakp
a5f0: 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  oint.**.** Then 
a600: 72 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20  run testfixture 
a610: 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20  in the debugger 
a620: 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65  and wait for the
a630: 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a   breakpoint to.*
a640: 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64  * fire.  Then ad
a650: 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f  ditional breakpo
a660: 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20  ints can be set 
a670: 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68  to trace down th
a680: 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  e bug..*/.static
a690: 20 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70   int test_breakp
a6a0: 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  oint(.  void *No
a6b0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
a6c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
a6d0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
a6e0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
a6f0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
a700: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a720: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
a730: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
a740: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
a750: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
a760: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
a770: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
a780: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
a790: 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  thing */.}../*.*
a7a0: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
a7b0: 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d  e3_bind_int  STM
a7c0: 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
a7d0: 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
a7e0: 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66  _bind_int interf
a7f0: 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
a800: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a810: 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
a820: 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
a830: 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
a840: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
a850: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
a860: 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69  binds a 32-bit i
a870: 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
a880: 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
a890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
a8a0: 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f  t_bind_int(.  vo
a8b0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
a8c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a8d0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
a8e0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
a8f0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
a900: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
a910: 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
a920: 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69    int value;.  i
a930: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
a940: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
a950: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a960: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a970: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a980: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
a990: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a9a0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
a9b0: 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
a9c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a9d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
a9e0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
a9f0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
aa00: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
aa10: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
aa20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aa30: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
aa40: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
aa50: 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
aa60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
aa70: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
aa80: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
aa90: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
aaa0: 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
aab0: 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
aac0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
aad0: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
aae0: 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
aaf0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
ab00: 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
ab10: 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
ab20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ab30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ab40: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
ab50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
ab60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ab70: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
ab80: 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
ab90: 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56  _int64  STMT N V
aba0: 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
abb0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
abc0: 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65  _int64 interface
abd0: 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
abe0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
abf0: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
ac00: 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
ac10: 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
ac20: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
ac30: 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
ac40: 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
ac50: 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
ac60: 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
ac70: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
ac80: 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69  ind_int64(.  voi
ac90: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
aca0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
acb0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
acc0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
acd0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
ace0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
acf0: 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
ad00: 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 69 6e   i64 value;.  in
ad10: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
ad20: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
ad30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ad40: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
ad50: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
ad60: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
ad70: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
ad80: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
ad90: 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
ada0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
adb0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
adc0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
add0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
ade0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
adf0: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
ae00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ae10: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
ae20: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
ae30: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
ae40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ae50: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69  .  if( Tcl_GetWi
ae60: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
ae70: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
ae80: 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54  alue) ) return T
ae90: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
aea0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  = sqlite3_bind_i
aeb0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 64 78 2c  nt64(pStmt, idx,
aec0: 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
aed0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
aee0: 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
aef0: 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
af00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
af10: 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
af20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
af30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
af40: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
af50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
af60: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
af70: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54  _bind_double  ST
af80: 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
af90: 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
afa0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e  3_bind_double in
afb0: 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
afc0: 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
afd0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
afe0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
aff0: 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
b000: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
b010: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
b020: 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62  .** binds a 64-b
b030: 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
b040: 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
b050: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b060: 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c   test_bind_doubl
b070: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
b080: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
b090: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
b0a0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
b0b0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b0c0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
b0d0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
b0e0: 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20  t idx;.  double 
b0f0: 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
b100: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
b110: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
b120: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b130: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
b140: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
b150: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
b160: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
b170: 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
b180: 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
b190: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b1a0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
b1b0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
b1c0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
b1d0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
b1e0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
b1f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
b200: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
b210: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
b220: 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
b230: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
b240: 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46  ( Tcl_GetDoubleF
b250: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
b260: 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
b270: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b280: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
b290: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
b2a0: 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
b2b0: 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
b2c0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
b2d0: 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
b2e0: 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
b2f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b300: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b310: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
b320: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
b330: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
b350: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
b360: 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a  null  STMT N.**.
b370: 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
b380: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e  te3_bind_null in
b390: 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
b3a0: 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
b3b0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
b3c0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
b3d0: 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
b3e0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
b3f0: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
b400: 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c  .** binds a NULL
b410: 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
b420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b430: 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a  test_bind_null(.
b440: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
b450: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
b460: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
b470: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
b480: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
b490: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
b4a0: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
b4b0: 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  dx;.  int rc;.. 
b4c0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
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 22 2c 20   0), " STMT N", 
b540: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
b550: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b560: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
b570: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
b580: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
b590: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
b5a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b5b0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
b5c0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b5d0: 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
b5e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b5f0: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
b600: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
b610: 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  mt, idx);.  if( 
b620: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
b630: 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
b640: 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
b650: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b660: 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
b670: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
b680: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b690: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
b6a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b6b0: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
b6c0: 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54  _bind_text  STMT
b6d0: 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
b6e0: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
b6f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
b700: 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
b710: 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
b720: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
b730: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
b740: 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
b750: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
b760: 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
b770: 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
b780: 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49  TF-8 string STRI
b790: 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  NG to the wildca
b7a0: 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  rd.  The string 
b7b0: 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a  is BYTES bytes.*
b7c0: 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  * long..*/.stati
b7d0: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
b7e0: 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  text(.  void * c
b7f0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
b800: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b810: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
b820: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
b830: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
b840: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
b850: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
b860: 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
b870: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
b880: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
b890: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
b8a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b8b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
b8c0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
b8d0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
b8e0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
b8f0: 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
b900: 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29  VALUE BYTES", 0)
b910: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
b920: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
b930: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
b940: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
b950: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
b960: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
b970: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b980: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
b990: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
b9a0: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
b9b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b9c0: 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
b9d0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
b9e0: 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
b9f0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
ba00: 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
ba10: 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
ba20: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
ba30: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
ba40: 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
ba50: 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49  lue, bytes, SQLI
ba60: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
ba70: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
ba80: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
ba90: 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
baa0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
bab0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
bac0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bad0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
bae0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
baf0: 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d  ite3TestErrorNam
bb00: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
bb10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bb20: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
bb30: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
bb40: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
bb50: 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 53 54  _bind_text16  ST
bb60: 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45  MT N STRING BYTE
bb70: 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
bb80: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
bb90: 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20  xt16 interface. 
bba0: 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
bbb0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
bbc0: 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
bbd0: 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
bbe0: 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
bbf0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
bc00: 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
bc10: 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67   a UTF-16 string
bc20: 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
bc30: 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
bc40: 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
bc50: 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
bc60: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
bc70: 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76  bind_text16(.  v
bc80: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
bc90: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
bca0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
bcb0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
bcc0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
bcd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bce0: 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
bcf0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
bd00: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
bd10: 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
bd20: 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
bd30: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
bd40: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
bd50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
bd60: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
bd70: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
bd80: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
bd90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
bda0: 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
bdb0: 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
bdc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
bdd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
bde0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
bdf0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
be00: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
be10: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
be20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
be30: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
be40: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
be50: 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
be60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
be70: 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f  ;.  value = Tcl_
be80: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
be90: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b  Obj(objv[3], 0);
bea0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
beb0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
bec0: 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
bed0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
bee0: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
bef0: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
bf00: 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76  6(pStmt, idx, (v
bf10: 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74  oid *)value, byt
bf20: 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  es, SQLITE_TRANS
bf30: 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c  IENT);.  if( sql
bf40: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
bf50: 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
bf60: 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
bf70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bf80: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
bf90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
bfa0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bfb0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
bfc0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
bfd0: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
bfe0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
bff0: 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
c000: 64 5f 62 6c 6f 62 20 20 53 54 4d 54 20 4e 20 44  d_blob  STMT N D
c010: 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ATA BYTES.**.** 
c020: 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
c030: 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72  _bind_blob inter
c040: 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
c050: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
c060: 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
c070: 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
c080: 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
c090: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
c0a0: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
c0b0: 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f   binds a BLOB to
c0c0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
c0d0: 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45  The BLOB is BYTE
c0e0: 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  S bytes in size.
c0f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
c100: 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
c110: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
c120: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
c130: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
c140: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
c150: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
c160: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
c170: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
c180: 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
c190: 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
c1a0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
c1b0: 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
c1c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c1d0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
c1e0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
c1f0: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
c200: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
c210: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
c220: 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59  " STMT N DATA BY
c230: 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
c240: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c250: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
c260: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
c270: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c280: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
c290: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
c2a0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
c2b0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
c2c0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
c2d0: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
c2e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
c2f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
c300: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (objv[3]);.  if(
c310: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
c320: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
c330: 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
c340: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c350: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
c360: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
c370: 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
c380: 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  es, SQLITE_TRANS
c390: 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c  IENT);.  if( sql
c3a0: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
c3b0: 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
c3c0: 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
c3d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c3e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c3f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
c400: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c410: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
c420: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
c430: 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
c440: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
c450: 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  nt  STMT.**.** R
c460: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c470: 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e   of wildcards in
c480: 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65   the given state
c490: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
c4a0: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
c4b0: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20  rameter_count(. 
c4c0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
c4d0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
c4e0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
c4f0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
c500: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
c510: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
c520: 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
c530: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
c540: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c550: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
c560: 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
c570: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c580: 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
c590: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
c5a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c5b0: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
c5c0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c5d0: 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
c5e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
c5f0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
c600: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
c610: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
c620: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
c630: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
c640: 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
c650: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
c660: 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a  me  STMT  N.**.*
c670: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
c680: 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c  e of the Nth wil
c690: 64 63 61 72 64 2e 20 20 54 68 65 20 66 69 72 73  dcard.  The firs
c6a0: 74 20 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e  t wildcard is 1.
c6b0: 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72  .** An empty str
c6c0: 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 20  ing is returned 
c6d0: 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  if N is out of r
c6e0: 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20 77  ange or if the w
c6f0: 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61  ildcard.** is na
c700: 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  meless..*/.stati
c710: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
c720: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a  parameter_name(.
c730: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
c740: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
c750: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
c760: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
c770: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
c780: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
c790: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
c7a0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
c7b0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
c7c0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c7d0: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
c7e0: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
c7f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
c800: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
c810: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
c820: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
c830: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
c840: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c850: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
c860: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
c870: 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72  objv[2], &i) ) r
c880: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c890: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
c8a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
c8b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
c8c0: 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  bj(sqlite3_bind_
c8d0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
c8e0: 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b  Stmt,i),-1).  );
c8f0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
c900: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
c910: 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
c920: 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
c930: 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a    STMT  NAME.**.
c940: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
c950: 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63  dex of the wildc
c960: 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ard called NAME.
c970: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
c980: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63  ere is.** no suc
c990: 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  h wildcard..*/.s
c9a0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
c9b0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
c9c0: 64 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  dex(.  void * cl
c9d0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
c9e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
c9f0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
ca00: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
ca10: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
ca20: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
ca30: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
ca40: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ca50: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
ca60: 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45  objv, "STMT NAME
ca70: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
ca80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
ca90: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
caa0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
cab0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
cac0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
cad0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cae0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
caf0: 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
cb00: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20  Tcl_NewIntObj(. 
cb10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
cb20: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
cb30: 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74  ex(pStmt,Tcl_Get
cb40: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
cb50: 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72  .     ).  );.  r
cb60: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
cb70: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
cb80: 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
cb90: 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a  ndings STMT.**.*
cba0: 2f 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 69  /.#if 0.static i
cbb0: 6e 74 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69  nt test_clear_bi
cbc0: 6e 64 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a  ndings(.  void *
cbd0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
cbe0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cbf0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
cc00: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
cc10: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
cc20: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
cc30: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
cc40: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
cc50: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cc60: 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
cc70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
cc80: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
cc90: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
cca0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
ccb0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
ccc0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
ccd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
cce0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ccf0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
cd00: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c  ntObj(sqlite3_cl
cd10: 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  ear_bindings(pSt
cd20: 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
cd30: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
cd40: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
cd50: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44  qlite3_errcode D
cd60: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
cd70: 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
cd80: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
cd90: 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
cda0: 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
cdb0: 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
cdc0: 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
cdd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
cde0: 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64  _errcode(.  void
cdf0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
ce00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ce10: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
ce20: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
ce30: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
ce40: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
ce50: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
ce60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ce70: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
ce80: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
ce90: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
cea0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ceb0: 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
cec0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ced0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
cee0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
cef0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
cf00: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
cf10: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
cf20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
cf30: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
cf40: 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61   (char *)errorNa
cf50: 6d 65 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  me(sqlite3_errco
cf60: 64 65 28 64 62 29 29 2c 20 30 29 3b 0a 20 20 72  de(db)), 0);.  r
cf70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
cf80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
cf90: 74 65 73 74 5f 65 72 72 6d 73 67 20 44 42 0a 2a  test_errmsg DB.*
cfa0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
cfb0: 20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74   UTF-8 represent
cfc0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72  ation of the err
cfd0: 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
cfe0: 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73  g for the.** mos
cff0: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
d000: 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a  _* API call..*/.
d010: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d020: 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a  errmsg(.  void *
d030: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
d040: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
d050: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
d060: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
d070: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
d080: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
d090: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20   char *zErr;..  
d0a0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
d0b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d0c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
d0d0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
d0e0: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
d0f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
d100: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
d110: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d120: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d130: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
d140: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
d150: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d160: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
d170: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45  TCL_ERROR;..  zE
d180: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rr = sqlite3_err
d190: 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  msg(db);.  Tcl_S
d1a0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
d1b0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
d1c0: 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b  gObj(zErr, -1));
d1d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
d1e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
d1f0: 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31  :   test_errmsg1
d200: 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  6 DB.**.** Retur
d210: 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20 72 65  ns the UTF-16 re
d220: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
d230: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
d240: 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  e string for the
d250: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  .** most recent 
d260: 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61  sqlite3_* API ca
d270: 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62 79  ll. This is a by
d280: 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74 20  te array object 
d290: 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c  at the TCL .** l
d2a0: 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63  evel, and it inc
d2b0: 6c 75 64 65 73 20 74 68 65 20 30 78 30 30 20 30  ludes the 0x00 0
d2c0: 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 62  x00 terminator b
d2d0: 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20  ytes at the end 
d2e0: 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36  of the.** UTF-16
d2f0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
d300: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
d310: 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  sg16(.  void * c
d320: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
d330: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d340: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
d350: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
d360: 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
d370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
d380: 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
d390: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
d3a0: 45 72 72 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Err;.  int bytes
d3b0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
d3c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
d3d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d3e0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
d3f0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
d400: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
d410: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
d420: 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
d430: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d440: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
d450: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
d460: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d470: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
d480: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d490: 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
d4a0: 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a  3_errmsg16(db);.
d4b0: 20 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65    bytes = sqlite
d4c0: 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 45  3utf16ByteLen(zE
d4d0: 72 72 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 53  rr, -1);.  Tcl_S
d4e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
d4f0: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
d500: 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79  rrayObj(zErr, by
d510: 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  tes));.#endif /*
d520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
d530: 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
d540: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
d550: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
d560: 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62 79  repare DB sql by
d570: 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a  tes tailvar.**.*
d580: 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
d590: 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
d5a0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
d5b0: 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
d5c0: 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
d5d0: 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
d5e0: 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
d5f0: 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
d600: 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
d610: 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
d620: 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
d630: 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
d640: 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
d650: 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
d660: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d670: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d680: 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20  prepare(.  void 
d690: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
d6a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d6b0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
d6c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d6d0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
d6e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
d6f0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
d700: 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
d710: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
d720: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
d730: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
d740: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
d750: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
d760: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
d770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d780: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
d790: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
d7a0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
d7b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d7c0: 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
d7d0: 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
d7e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
d7f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d800: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
d810: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
d820: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
d830: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
d840: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
d850: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d860: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
d870: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
d880: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
d890: 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
d8a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d8b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
d8c0: 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c  prepare(db, zSql
d8d0: 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
d8e0: 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20   &zTail);.  if( 
d8f0: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
d900: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
d910: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
d920: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61  ERROR;.  if( zTa
d930: 69 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79  il ){.    if( by
d940: 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes>=0 ){.      
d950: 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20  bytes = bytes - 
d960: 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20  (zTail-zSql);.  
d970: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53    }.    Tcl_ObjS
d980: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
d990: 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e  bjv[4], 0, Tcl_N
d9a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69  ewStringObj(zTai
d9b0: 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20  l, bytes), 0);. 
d9c0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
d9d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
d9e0: 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
d9f0: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
da00: 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
da10: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
da20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
da30: 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
da40: 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
da50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
da60: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
da70: 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  tmt ){.    if( m
da80: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
da90: 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
daa0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
dab0: 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41  ERROR;.    Tcl_A
dac0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
dad0: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
dae0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
daf0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
db00: 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
db10: 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  re DB sql bytes 
db20: 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f  tailvar.**.** Co
db30: 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
db40: 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
db50: 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
db60: 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
db70: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
db80: 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
db90: 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
dba0: 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
dbb0: 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
dbc0: 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
dbd0: 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
dbe0: 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
dbf0: 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
dc00: 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
dc10: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
dc20: 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
dc30: 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  are16(.  void * 
dc40: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
dc50: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
dc60: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
dc70: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
dc80: 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
dc90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
dca0: 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
dcb0: 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
dcc0: 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  zSql;.  const vo
dcd0: 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  id *zTail = 0;. 
dce0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20   Tcl_Obj *pTail 
dcf0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
dd00: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
dd10: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
dd20: 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e   .  int rc;.  in
dd30: 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20  t bytes;        
dd40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
dd50: 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64  nteger specified
dd60: 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69   as arg 3 */.  i
dd70: 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20  nt objlen;      
dd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dd90: 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74  byte-array lengt
dda0: 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20  h of arg 2 */.. 
ddb0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
ddc0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ddd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
dde0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
ddf0: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
de00: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
de10: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
de20: 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
de30: 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
de40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
de50: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
de60: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
de70: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
de80: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
de90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dea0: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79  zSql = Tcl_GetBy
deb0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
dec0: 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29  bjv[2], &objlen)
ded0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
dee0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
def0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
df00: 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
df10: 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
df20: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
df30: 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
df40: 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c  , &pStmt, &zTail
df50: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
df60: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
df70: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
df80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
df90: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
dfa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dfb0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61  ;.  }..  if( zTa
dfc0: 69 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e  il ){.    objlen
dfd0: 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38   = objlen - ((u8
dfe0: 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
dff0: 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Sql);.  }else{. 
e000: 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20     objlen = 0;. 
e010: 20 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c   }.  pTail = Tcl
e020: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
e030: 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62  ((u8 *)zTail, ob
e040: 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  jlen);.  Tcl_Inc
e050: 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
e060: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61  ;.  Tcl_ObjSetVa
e070: 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
e080: 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29  4], 0, pTail, 0)
e090: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
e0a0: 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20  ount(pTail);..  
e0b0: 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
e0c0: 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72   if( makePointer
e0d0: 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
e0e0: 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
e0f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e100: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
e110: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
e120: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
e130: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
e140: 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
e150: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
e160: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70  sage: sqlite3_op
e170: 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74  en filename ?opt
e180: 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74  ions-list?.*/.st
e190: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70  atic int test_op
e1a0: 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  en(.  void * cli
e1b0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
e1c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
e1d0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
e1e0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
e1f0: 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
e200: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
e210: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
e220: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
e230: 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
e240: 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
e250: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
e260: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e270: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
e280: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
e290: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
e2a0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
e2b0: 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
e2c0: 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
e2d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e2e0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
e2f0: 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
e300: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
e310: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
e320: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
e330: 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d  &db);.  .  if( m
e340: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
e350: 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
e360: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e370: 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
e380: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
e390: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
e3a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
e3b0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
e3c0: 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d  3_open16 filenam
e3d0: 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  e options.*/.sta
e3e0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
e3f0: 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  n16(.  void * cl
e400: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
e410: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
e420: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
e430: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
e440: 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
e450: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
e460: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
e470: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
e480: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
e490: 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  c;.  char zBuf[1
e4a0: 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
e4b0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
e4c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e4d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
e4e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
e4f0: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
e500: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
e510: 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
e520: 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
e530: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e540: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
e550: 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
e560: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
e570: 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
e580: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
e590: 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  n16(zFilename, &
e5a0: 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d 61  db);.  .  if( ma
e5b0: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
e5c0: 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
e5d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e5e0: 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
e5f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
e600: 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
e610: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
e620: 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
e630: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e640: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
e650: 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d  complete16 <UTF-
e660: 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a  16 string>.**.**
e670: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
e680: 20 73 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65   supplied argume
e690: 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  nt is a complete
e6a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
e6b0: 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  or zero.** other
e6c0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
e6d0: 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74  int test_complet
e6e0: 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
e6f0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
e700: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
e710: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
e720: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
e730: 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69  v[].){.#if !defi
e740: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e750: 43 4f 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65  COMPLETE) && !de
e760: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e770: 54 5f 55 54 46 31 36 29 0a 20 20 63 68 61 72 20  T_UTF16).  char 
e780: 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62  *zBuf;..  if( ob
e790: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
e7a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e7b0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
e7c0: 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a  <utf-16 sql>");.
e7d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e7e0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75  RROR;.  }..  zBu
e7f0: 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  f = Tcl_GetByteA
e800: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
e810: 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  [1], 0);.  Tcl_S
e820: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
e830: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
e840: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  j(sqlite3_comple
e850: 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65  te16(zBuf)));.#e
e860: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e870: 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20  MIT_COMPLETE && 
e880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
e890: 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
e8a0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
e8b0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74  sage: sqlite3_st
e8c0: 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64  ep STMT.**.** Ad
e8d0: 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d  vance the statem
e8e0: 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ent to the next 
e8f0: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
e900: 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20  nt test_step(.  
e910: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
e920: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
e930: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
e940: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
e950: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
e960: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e970: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
e980: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
e990: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
e9a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e9b0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
e9c0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
e9d0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
e9e0: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
e9f0: 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
ea00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ea10: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
ea20: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
ea30: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ea40: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
ea50: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
ea60: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
ea70: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
ea80: 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21  );..  /* if( rc!
ea90: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
eaa0: 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
eab0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
eac0: 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52  R; */.  Tcl_SetR
ead0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
eae0: 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28  har *)errorName(
eaf0: 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
eb00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
eb10: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
eb20: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53  3_column_count S
eb30: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
eb40: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
eb50: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
eb60: 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
eb70: 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
eb80: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
eb90: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76  olumn_count(.  v
eba0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
ebb0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
ebc0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
ebd0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
ebe0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
ebf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
ec00: 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
ec10: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
ec20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ec30: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
ec40: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
ec50: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
ec60: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
ec70: 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
ec80: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
ec90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
eca0: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
ecb0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
ecc0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ecd0: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
ece0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ecf0: 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
ed00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
ed10: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
ed20: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
ed30: 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
ed40: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
ed50: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
ed60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
ed70: 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
ed80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  ** Return the ty
ed90: 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  pe of the data i
eda0: 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
edb0: 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
edc0: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
edd0: 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
ede0: 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  type(.  void * c
edf0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
ee00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ee10: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
ee20: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ee30: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
ee40: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
ee50: 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20   int col;.  int 
ee60: 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  tp;..  if( objc!
ee70: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
ee80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ee90: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
eea0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
eeb0: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
eec0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
eed0: 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
eee0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
eef0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
ef00: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
ef10: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
ef20: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ef30: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
ef40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ef50: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
ef60: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
ef70: 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
ef80: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ef90: 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69  OR;..  tp = sqli
efa0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
efb0: 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73  pStmt, col);.  s
efc0: 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20  witch( tp ){.   
efd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
efe0: 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c  EGER: .      Tcl
eff0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
f000: 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43  p, "INTEGER", TC
f010: 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
f020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f030: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20  e SQLITE_NULL:. 
f040: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
f050: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c  lt(interp, "NULL
f060: 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
f070: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
f090: 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  OAT:.      Tcl_S
f0a0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f0b0: 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54   "FLOAT", TCL_ST
f0c0: 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
f0d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
f0e0: 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20  LITE_TEXT:.     
f0f0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
f100: 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54  nterp, "TEXT", T
f110: 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
f120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f130: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a  se SQLITE_BLOB:.
f140: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
f150: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f  ult(interp, "BLO
f160: 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  B", TCL_STATIC);
f170: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
f180: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f190: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d    assert(0);.  }
f1a0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
f1b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
f1c0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
f1d0: 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c  n_int64 STMT col
f1e0: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
f1f0: 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
f200: 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
f210: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
f220: 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69  cast as an.** wi
f230: 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65  de (64-bit) inte
f240: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
f250: 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69  nt test_column_i
f260: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
f270: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
f280: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
f290: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
f2a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
f2b0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
f2c0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
f2d0: 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20   int col;.  i64 
f2e0: 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  iVal;..  if( obj
f2f0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f300: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f310: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f320: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f330: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
f340: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
f350: 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
f360: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
f370: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f380: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
f390: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f3a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f3b0: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
f3c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f3d0: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
f3e0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
f3f0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
f400: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f410: 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20  RROR;..  iVal = 
f420: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
f430: 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29  nt64(pStmt, col)
f440: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
f450: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
f460: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69  _NewWideIntObj(i
f470: 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
f480: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
f490: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
f4a0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54  column_blob STMT
f4b0: 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
f4c0: 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
f4d0: 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  n_blob(.  void *
f4e0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
f4f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
f500: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
f510: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
f520: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
f530: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
f540: 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69  .  int col;..  i
f550: 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20  nt len;.  const 
f560: 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20  void *pBlob;..  
f570: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
f580: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f590: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
f5a0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
f5b0: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
f5c0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
f5d0: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
f5e0: 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
f5f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f600: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
f610: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
f620: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
f630: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
f640: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
f650: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
f660: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
f670: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
f680: 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
f690: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
f6a0: 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
f6b0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
f6c0: 74 2c 20 63 6f 6c 29 3b 0a 20 20 6c 65 6e 20 3d  t, col);.  len =
f6d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f6e0: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c  bytes(pStmt, col
f6f0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
f700: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
f710: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
f720: 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a  j(pBlob, len));.
f730: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
f750: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f760: 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75  double STMT colu
f770: 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
f780: 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
f790: 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
f7a0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
f7b0: 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e  ast as a double.
f7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
f7d0: 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
f7e0: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
f7f0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
f800: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
f810: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
f820: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
f830: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
f840: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
f850: 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20  t col;.  double 
f860: 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  rVal;..  if( obj
f870: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f880: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f890: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f8a0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f8b0: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
f8c0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
f8d0: 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
f8e0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
f8f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f900: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
f910: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f920: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f930: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
f940: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f950: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
f960: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
f970: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
f980: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f990: 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20  RROR;..  rVal = 
f9a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
f9b0: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c  ouble(pStmt, col
f9c0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
f9d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
f9e0: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
f9f0: 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
fa00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
fa10: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
fa20: 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20  data_count STMT 
fa30: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
fa40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
fa50: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
fa60: 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
fa70: 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69  t STMT..*/.stati
fa80: 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f  c int test_data_
fa90: 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
faa0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
fab0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
fac0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
fad0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
fae0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
faf0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
fb00: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
fb10: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
fb20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
fb30: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
fb40: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
fb50: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
fb60: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
fb70: 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
fb80: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fb90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
fba0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
fbb0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
fbc0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
fbd0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
fbe0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
fbf0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
fc00: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
fc10: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64  IntObj(sqlite3_d
fc20: 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ata_count(pStmt)
fc30: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
fc40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
fc50: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
fc60: 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f  umn_text STMT co
fc70: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
fc80: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
fc90: 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63  _decltype STMT c
fca0: 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
fcb0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
fcc0: 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75  n_name STMT colu
fcd0: 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
fce0: 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28   test_stmt_utf8(
fcf0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fd00: 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  Data,        /* 
fd10: 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
fd20: 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
fd30: 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20  o be invoke */. 
fd40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
fd50: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
fd60: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
fd70: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
fd80: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
fd90: 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
fda0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46  const char *(*xF
fdb0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
fdc0: 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e  t*, int) = clien
fdd0: 74 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63  tData;.  const c
fde0: 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 69 66  har *zRet;..  if
fdf0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
fe00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
fe10: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
fe20: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
fe30: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
fe40: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
fe50: 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
fe60: 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
fe70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fe80: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
fe90: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
fea0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
feb0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
fec0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
fed0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
fee0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
fef0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
ff00: 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
ff10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65  TCL_ERROR;.  zRe
ff20: 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c  t = xFunc(pStmt,
ff30: 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65   col);.  if( zRe
ff40: 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  t ){.    Tcl_Set
ff50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
ff60: 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b  char *)zRet, 0);
ff70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
ff80: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
ff90: 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f  int test_global_
ffa0: 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20  recover(.  void 
ffb0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
ffc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
ffd0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
ffe0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
fff0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
10000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
10010 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 20 20 69  LOBALRECOVER.  i
10020 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a  nt rc;.  if( obj
10030 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
10040 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10050 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
10060 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10070 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
10080 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  c = sqlite3_glob
10090 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20  al_recover();.  
100a0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
100b0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72  terp, (char *)er
100c0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
100d0 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69 66  _STATIC);.#endif
100e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
100f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
10100 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
10110 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d  _text STMT colum
10120 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
10130 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
10140 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  cltype STMT colu
10150 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
10160 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
10170 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ame STMT column.
10180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
10190 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a 20  st_stmt_utf16(. 
101a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
101b0 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ta,     /* Point
101c0 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49  er to SQLite API
101d0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
101e0 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c  invoked */.  Tcl
101f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10200 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10210 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10220 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
10230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
10240 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  6.  sqlite3_stmt
10250 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
10260 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ol;.  Tcl_Obj *p
10270 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Ret;.  const voi
10280 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f  d *zName16;.  co
10290 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e  nst void *(*xFun
102a0 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
102b0 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44  , int) = clientD
102c0 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ata;..  if( objc
102d0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
102e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
102f0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10300 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10310 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
10320 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
10330 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
10340 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
10350 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10360 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
10370 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10380 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10390 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
103a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
103b0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
103c0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
103d0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
103e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
103f0 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20  ROR;..  zName16 
10400 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
10410 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ol);.  if( zName
10420 31 36 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  16 ){.    pRet =
10430 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
10440 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71  yObj(zName16, sq
10450 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c 65  lite3utf16ByteLe
10460 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32  n(zName16, -1)+2
10470 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
10480 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10490 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pRet);.  }.#endi
104a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
104b0 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74  _UTF16 */..  ret
104c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
104d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
104e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53  te3_column_int S
104f0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
10500 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10510 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d  column_bytes STM
10520 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
10530 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
10540 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d  lumn_bytes16 STM
10550 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73  T column.**.*/.s
10560 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
10570 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20  tmt_int(.  void 
10580 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  * clientData,   
10590 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
105a0 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
105b0 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
105c0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
105d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
105e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
105f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
10600 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10610 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
10620 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63  l;.  int (*xFunc
10630 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
10640 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61   int) = clientDa
10650 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ta;..  if( objc!
10660 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
10670 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10680 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
10690 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
106a0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
106b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
106c0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
106d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
106e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
106f0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10700 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10710 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10720 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
10730 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10740 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
10750 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
10760 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
10770 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10780 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
10790 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
107a0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46  Tcl_NewIntObj(xF
107b0 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29  unc(pStmt, col))
107c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
107d0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
107e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
107f0 4f 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  O./*.** Usage:  
10800 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
10810 64 57 72 69 74 65 20 3c 66 69 6c 65 6e 61 6d 65  dWrite <filename
10820 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
10830 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70  test_sqlite3OsOp
10840 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 76  enReadWrite(.  v
10850 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10860 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10870 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10880 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10890 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
108a0 20 4f 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b   OsFile * pFile;
108b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
108c0 20 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a   dummy;.  char z
108d0 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
108e0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
108f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10900 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
10910 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
10920 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
10930 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10940 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
10950 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
10960 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10970 7d 0a 0a 20 20 70 46 69 6c 65 20 3d 20 73 71 6c  }..  pFile = sql
10980 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
10990 28 4f 73 46 69 6c 65 29 29 3b 0a 20 20 72 63 20  (OsFile));.  rc 
109a0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
109b0 65 61 64 57 72 69 74 65 28 54 63 6c 5f 47 65 74  eadWrite(Tcl_Get
109c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
109d0 20 70 46 69 6c 65 2c 20 26 64 75 6d 6d 79 29 3b   pFile, &dummy);
109e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
109f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
10a00 74 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a 20  teFree(pFile);. 
10a10 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
10a20 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
10a30 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  )errorName(rc), 
10a40 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
10a50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10a60 52 3b 0a 20 20 7d 0a 20 20 6d 61 6b 65 50 6f 69  R;.  }.  makePoi
10a70 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
10a80 7a 42 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20  zBuf, pFile);.  
10a90 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
10aa0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
10ab0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10ac0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
10ad0 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  ge:  sqlite3OsCl
10ae0 6f 73 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65  ose <file handle
10af0 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
10b00 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c  test_sqlite3OsCl
10b10 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ose(.  void * cl
10b20 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10b30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10b40 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10b50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10b60 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
10b70 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
10b80 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
10b90 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
10ba0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10bb0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
10bc0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
10bd0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
10be0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
10bf0 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30  " filehandle", 0
10c00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10c10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
10c20 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74  if( getFilePoint
10c30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
10c40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
10c50 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20  ), &pFile) ){.  
10c60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10c70 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
10c80 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 46  qlite3OsClose(pF
10c90 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
10ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10cb0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
10cc0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
10cd0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
10ce0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
10cf0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10d00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
10d10 65 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75  e(pFile);.  retu
10d20 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
10d30 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
10d40 74 65 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65 20  te3OsLock <file 
10d50 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79 70  handle> <locktyp
10d60 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e>.*/.static int
10d70 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c   test_sqlite3OsL
10d80 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
10d90 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10da0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10db0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10dc0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10dd0 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
10de0 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
10df0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
10e00 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
10e10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10e20 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
10e30 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
10e40 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
10e50 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
10e60 20 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c 65   .        " file
10e70 68 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c 52  handle (SHARED|R
10e80 45 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c  ESERVED|PENDING|
10e90 45 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29 3b  EXCLUSIVE)", 0);
10ea0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10eb0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
10ec0 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  ( getFilePointer
10ed0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10ee0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10ef0 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20   &pFile) ){.    
10f00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10f10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d  ;.  }..  if( 0==
10f20 73 74 72 63 6d 70 28 22 53 48 41 52 45 44 22 2c  strcmp("SHARED",
10f30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
10f40 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[2])) ){.    
10f50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
10f60 63 6b 28 70 46 69 6c 65 2c 20 53 48 41 52 45 44  ck(pFile, SHARED
10f70 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c  _LOCK);.  }.  el
10f80 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70  se if( 0==strcmp
10f90 28 22 52 45 53 45 52 56 45 44 22 2c 20 54 63 6c  ("RESERVED", Tcl
10fa0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10fb0 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  2])) ){.    rc =
10fc0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
10fd0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 4c  File, RESERVED_L
10fe0 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  OCK);.  }.  else
10ff0 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22   if( 0==strcmp("
11000 50 45 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47 65  PENDING", Tcl_Ge
11010 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
11020 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
11030 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c  lite3OsLock(pFil
11040 65 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  e, PENDING_LOCK)
11050 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
11060 20 30 3d 3d 73 74 72 63 6d 70 28 22 45 58 43 4c   0==strcmp("EXCL
11070 55 53 49 56 45 22 2c 20 54 63 6c 5f 47 65 74 53  USIVE", Tcl_GetS
11080 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
11090 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
110a0 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c  te3OsLock(pFile,
110b0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
110c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
110d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
110e0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
110f0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
11100 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54   \"", .        T
11110 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11120 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  v[0]), .        
11130 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48  " filehandle (SH
11140 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45  ARED|RESERVED|PE
11150 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29  NDING|EXCLUSIVE)
11160 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
11170 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11180 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
11190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
111a0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
111b0 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72  p, (char *)error
111c0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
111d0 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
111e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
111f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
11200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
11210 3a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  :  sqlite3OsUnlo
11220 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e  ck <file handle>
11230 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
11240 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c  est_sqlite3OsUnl
11250 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
11260 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
11270 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
11280 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
11290 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
112a0 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
112b0 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
112c0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
112d0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
112e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
112f0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
11300 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
11310 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
11320 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
11330 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30  " filehandle", 0
11340 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11350 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
11360 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74  if( getFilePoint
11370 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
11380 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11390 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20  ), &pFile) ){.  
113a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
113b0 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
113c0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
113d0 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
113e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
113f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
11400 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11410 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61   (char *)errorNa
11420 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
11430 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
11440 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11450 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11460 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
11470 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
11480 6c 65 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63  leName.*/.static
11490 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65   int test_sqlite
114a0 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
114b0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
114c0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
114d0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
114e0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
114f0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
11500 29 7b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b  ){.  char zFile[
11510 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
11520 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  SIZE];.  int rc;
11530 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
11540 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
11550 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
11560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11570 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
11580 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
11590 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  errorName(rc), T
115a0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
115b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
115c0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
115d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
115e0 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20 72 65   zFile, 0);.  re
115f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
11600 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
11610 67 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f  ge:  sqlite_set_
11620 6d 61 67 69 63 20 20 44 42 20 20 4d 41 47 49 43  magic  DB  MAGIC
11630 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65  -NUMBER.**.** Se
11640 74 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20  t the db->magic 
11650 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20  value.  This is 
11660 75 73 65 64 20 74 6f 20 74 65 73 74 20 65 72 72  used to test err
11670 6f 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69  or recovery logi
11680 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
11690 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69   sqlite_set_magi
116a0 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  c(.  void * clie
116b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
116c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
116d0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
116e0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
116f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
11700 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
11710 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11720 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
11730 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
11740 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
11750 20 20 20 20 20 20 20 20 22 20 44 42 20 4d 41 47          " DB MAG
11760 49 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  IC", 0);.    ret
11770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11780 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
11790 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
117a0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
117b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
117c0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
117d0 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
117e0 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b  GIC_OPEN")==0 ){
117f0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
11800 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
11810 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
11820 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
11830 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c  "SQLITE_MAGIC_CL
11840 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20  OSED")==0 ){.   
11850 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
11860 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
11870 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
11880 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
11890 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
118a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
118b0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
118c0 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65  MAGIC_BUSY;.  }e
118d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
118e0 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
118f0 4d 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30  MAGIC_ERROR")==0
11900 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
11910 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
11920 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20  _ERROR;.  }else 
11930 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
11940 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20  nterp, argv[2], 
11950 26 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20  &db->magic) ){. 
11960 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11970 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
11980 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
11990 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
119a0 65 33 5f 69 6e 74 65 72 72 75 70 74 20 20 44 42  e3_interrupt  DB
119b0 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20   .**.** Trigger 
119c0 61 6e 20 69 6e 74 65 72 72 75 70 74 20 6f 6e 20  an interrupt on 
119d0 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
119e0 20 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 28   test_interrupt(
119f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
11a00 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
11a10 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
11a20 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
11a30 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
11a40 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
11a50 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
11a60 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11a70 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
11a80 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
11a90 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
11aa0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
11ab0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11ac0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
11ad0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
11ae0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
11af0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11b00 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
11b10 70 74 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  pt(db);.  return
11b20 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
11b30 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
11b40 33 5f 73 6c 65 65 70 20 6d 73 20 0a 2a 2a 0a 2a  3_sleep ms .**.*
11b50 2a 20 53 6c 65 65 70 20 66 6f 72 20 74 68 65 20  * Sleep for the 
11b60 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
11b70 20 6f 66 20 6d 73 2e 0a 2a 2f 0a 23 69 66 20 30   of ms..*/.#if 0
11b80 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11b90 5f 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a  _sleep(.  void *
11ba0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11bb0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11bc0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
11bd0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
11be0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
11bf0 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
11c00 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11c10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
11c20 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
11c30 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
11c40 30 5d 2c 20 22 20 6d 73 22 2c 20 30 29 3b 0a 20  0], " ms", 0);. 
11c50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11c60 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  ROR;.  }.  Tcl_S
11c70 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11c80 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
11c90 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  j(sqlite3_sleep(
11ca0 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 29 29 29  atoi(argv[1]))))
11cb0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
11cc0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
11cd0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
11ce0 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
11cf0 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
11d00 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
11d10 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
11d20 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27   'function-name'
11d30 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68   from database h
11d40 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20  andle DB. It.** 
11d50 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
11d60 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
11d70 6e 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  n was created as
11d80 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65   UTF8, any numbe
11d90 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  r of.** argument
11da0 73 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54  s (the way the T
11db0 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  CL interface doe
11dc0 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  s it)..*/.static
11dd0 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63   int delete_func
11de0 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
11df0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11e00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11e10 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
11e20 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
11e30 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
11e40 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
11e50 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
11e60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11e70 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
11e80 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
11e90 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
11ea0 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
11eb0 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
11ec0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11ed0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
11ee0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
11ef0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
11f00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11f10 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
11f20 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11f30 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
11f40 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
11f50 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
11f60 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
11f70 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
11f80 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
11f90 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
11fa0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
11fb0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
11fc0 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  te_delete_collat
11fd0 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e  ion DB collation
11fe0 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  -name.**.** Dele
11ff0 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  te the collation
12000 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61   sequence 'colla
12010 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20  tion-name' from 
12020 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12030 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61 73  .** DB. It is as
12040 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
12050 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12060 65 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  e was created as
12070 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20 77   UTF8 (the .** w
12080 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  ay the TCL inter
12090 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a  face does it)..*
120a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c  /.static int del
120b0 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ete_collation(. 
120c0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
120d0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
120e0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
120f0 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
12100 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rgv.){.  int rc;
12110 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
12120 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
12130 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
12140 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
12150 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
12160 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
12170 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
12180 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
12190 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
121a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
121b0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
121c0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
121d0 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
121e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
121f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
12200 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
12210 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54  , argv[2], SQLIT
12220 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20  E_UTF8, 0, 0);. 
12230 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
12240 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
12250 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
12260 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
12270 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
12280 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
12290 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
122a0 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  it DB.**.** Retu
122b0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 64  rn true if the d
122c0 61 74 61 62 61 73 65 20 44 42 20 69 73 20 63 75  atabase DB is cu
122d0 72 72 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d  rrently in auto-
122e0 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20  commit mode..** 
122f0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
12300 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
12310 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  nt get_autocommi
12320 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
12330 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
12340 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12350 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
12360 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61   **argv.){.  cha
12370 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71  r zBuf[30];.  sq
12380 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
12390 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
123a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
123b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
123c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
123d0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
123e0 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20  .        " DB", 
123f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12400 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
12410 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
12420 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
12430 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
12440 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72  TCL_ERROR;.  spr
12450 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
12460 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
12470 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20  ocommit(db));.  
12480 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12490 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
124a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
124b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
124c0 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c  ge:  tcl_variabl
124d0 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e  e_type VARIABLEN
124e0 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
124f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12500 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
12510 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  entation for the
12520 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
12530 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e   given variable.
12540 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
12550 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
12560 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12570 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12580 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12590 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
125a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
125b0 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
125c0 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  Var;.  if( objc!
125d0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
125e0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
125f0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52  p, 1, objv, "VAR
12600 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74  IABLE");.    ret
12610 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12620 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f   }.  pVar = Tcl_
12630 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
12640 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
12650 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c  objv[1]), 0, TCL
12660 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b  _LEAVE_ERR_MSG);
12670 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29  .  if( pVar==0 )
12680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12690 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74  R;.  if( pVar->t
126a0 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63  ypePtr ){.    Tc
126b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
126c0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
126d0 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79  ringObj(pVar->ty
126e0 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29  pePtr->name, -1)
126f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12700 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
12710 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
12720 74 73 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ts entries in th
12730 65 20 67 6c 6f 62 61 6c 20 3a 3a 73 71 6c 69 74  e global ::sqlit
12740 65 5f 6f 70 74 69 6f 6e 73 28 29 20 61 72 72 61  e_options() arra
12750 79 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 63  y variable.** ac
12760 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
12770 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 63 6f 6e 66  ompile-time conf
12780 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iguration of the
12790 20 64 61 74 61 62 61 73 65 2e 20 20 54 65 73 74   database.  Test
127a0 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 73 20 75  .** procedures u
127b0 73 65 20 74 68 69 73 20 74 6f 20 64 65 74 65 72  se this to deter
127c0 6d 69 6e 65 20 77 68 65 6e 20 74 65 73 74 73 20  mine when tests 
127d0 73 68 6f 75 6c 64 20 62 65 20 6f 6d 69 74 74 65  should be omitte
127e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
127f0 64 20 73 65 74 5f 6f 70 74 69 6f 6e 73 28 54 63  d set_options(Tc
12800 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12810 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12820 5f 33 32 42 49 54 5f 52 4f 57 49 44 0a 20 20 54  _32BIT_ROWID.  T
12830 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
12840 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
12850 6e 73 22 2c 20 22 72 6f 77 69 64 33 32 22 2c 20  ns", "rowid32", 
12860 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
12870 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54  ONLY);.#else.  T
12880 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
12890 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
128a0 6e 73 22 2c 20 22 72 6f 77 69 64 33 32 22 2c 20  ns", "rowid32", 
128b0 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "0", TCL_GLOBAL_
128c0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
128d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
128e0 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 54  T_ALTERTABLE.  T
128f0 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
12900 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
12910 6e 73 22 2c 20 22 61 6c 74 65 72 74 61 62 6c 65  ns", "altertable
12920 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "0", TCL_GLOB
12930 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a  AL_ONLY);.#else.
12940 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
12950 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
12960 74 69 6f 6e 73 22 2c 20 22 61 6c 74 65 72 74 61  tions", "alterta
12970 62 6c 65 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  ble", "1", TCL_G
12980 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
12990 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
129a0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
129b0 41 54 49 4f 4e 0a 20 20 54 63 6c 5f 53 65 74 56  ATION.  Tcl_SetV
129c0 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
129d0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61  ite_options", "a
129e0 75 74 68 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47  uth", "0", TCL_G
129f0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c  LOBAL_ONLY);.#el
12a00 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  se.  Tcl_SetVar2
12a10 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
12a20 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61 75 74 68  _options", "auth
12a30 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
12a40 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
12a50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12a60 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
12a70 4e 54 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  NT.  Tcl_SetVar2
12a80 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
12a90 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61 75 74 6f  _options", "auto
12aa0 69 6e 63 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47  inc", "0", TCL_G
12ab0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c  LOBAL_ONLY);.#el
12ac0 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  se.  Tcl_SetVar2
12ad0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
12ae0 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61 75 74 6f  _options", "auto
12af0 69 6e 63 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  inc", "1", TCL_G
12b00 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
12b10 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
12b20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12b30 55 4d 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  UM.  Tcl_SetVar2
12b40 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
12b50 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61 75 74 6f  _options", "auto
12b60 76 61 63 75 75 6d 22 2c 20 22 30 22 2c 20 54 43  vacuum", "0", TC
12b70 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
12b80 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
12b90 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
12ba0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61  ite_options", "a
12bb0 75 74 6f 76 61 63 75 75 6d 22 2c 20 22 31 22 2c  utovacuum", "1",
12bc0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
12bd0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
12be0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12bf0 55 55 4d 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  UUM */.#if !defi
12c00 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
12c10 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 20 7c  LT_AUTOVACUUM) |
12c20 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  | SQLITE_DEFAULT
12c30 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 30 0a 20  _AUTOVACUUM==0. 
12c40 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
12c50 65 72 70 2c 22 73 71 6c 69 74 65 5f 6f 70 74 69  erp,"sqlite_opti
12c60 6f 6e 73 22 2c 22 64 65 66 61 75 6c 74 5f 61 75  ons","default_au
12c70 74 6f 76 61 63 75 75 6d 22 2c 22 30 22 2c 54 43  tovacuum","0",TC
12c80 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
12c90 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
12ca0 61 72 32 28 69 6e 74 65 72 70 2c 22 73 71 6c 69  ar2(interp,"sqli
12cb0 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 22 64 65 66  te_options","def
12cc0 61 75 6c 74 5f 61 75 74 6f 76 61 63 75 75 6d 22  ault_autovacuum"
12cd0 2c 22 31 22 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  ,"1",TCL_GLOBAL_
12ce0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
12cf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12d00 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
12d10 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
12d20 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
12d30 69 6f 6e 73 22 2c 20 22 62 6c 6f 62 6c 69 74 22  ions", "bloblit"
12d40 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "0", TCL_GLOBA
12d50 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20  L_ONLY);.#else. 
12d60 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
12d70 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
12d80 69 6f 6e 73 22 2c 20 22 62 6c 6f 62 6c 69 74 22  ions", "bloblit"
12d90 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "1", TCL_GLOBA
12da0 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  L_ONLY);.#endif.
12db0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12dc0 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 54  MIT_COMPLETE.  T
12dd0 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
12de0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
12df0 6e 73 22 2c 20 22 63 6f 6d 70 6c 65 74 65 22 2c  ns", "complete",
12e00 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "0", TCL_GLOBAL
12e10 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20  _ONLY);.#else.  
12e20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
12e30 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
12e40 6f 6e 73 22 2c 20 22 63 6f 6d 70 6c 65 74 65 22  ons", "complete"
12e50 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "1", TCL_GLOBA
12e60 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  L_ONLY);.#endif.
12e70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12e80 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12e90 45 43 54 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  ECT.  Tcl_SetVar
12ea0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
12eb0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 63 6f 6d  e_options", "com
12ec0 70 6f 75 6e 64 22 2c 20 22 30 22 2c 20 54 43 4c  pound", "0", TCL
12ed0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
12ee0 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61  else.  Tcl_SetVa
12ef0 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
12f00 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 63 6f  te_options", "co
12f10 6d 70 6f 75 6e 64 22 2c 20 22 31 22 2c 20 54 43  mpound", "1", TC
12f20 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
12f30 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
12f40 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 46 4c  QLITE_OMIT_CONFL
12f50 49 43 54 5f 43 4c 41 55 53 45 0a 20 20 54 63 6c  ICT_CLAUSE.  Tcl
12f60 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
12f70 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
12f80 22 2c 20 22 63 6f 6e 66 6c 69 63 74 22 2c 20 22  ", "conflict", "
12f90 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
12fa0 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63  NLY);.#else.  Tc
12fb0 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
12fc0 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
12fd0 73 22 2c 20 22 63 6f 6e 66 6c 69 63 74 22 2c 20  s", "conflict", 
12fe0 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
12ff0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
13000 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13010 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e 43 53  T_DATETIME_FUNCS
13020 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69  .  Tcl_SetVar2(i
13030 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
13040 70 74 69 6f 6e 73 22 2c 20 22 64 61 74 65 74 69  ptions", "dateti
13050 6d 65 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c  me", "0", TCL_GL
13060 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73  OBAL_ONLY);.#els
13070 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  e.  Tcl_SetVar2(
13080 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
13090 6f 70 74 69 6f 6e 73 22 2c 20 22 64 61 74 65 74  options", "datet
130a0 69 6d 65 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  ime", "1", TCL_G
130b0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
130c0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
130d0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
130e0 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
130f0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
13100 69 6f 6e 73 22 2c 20 22 64 69 73 6b 69 6f 22 2c  ions", "diskio",
13110 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "0", TCL_GLOBAL
13120 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20  _ONLY);.#else.  
13130 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
13140 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
13150 6f 6e 73 22 2c 20 22 64 69 73 6b 69 6f 22 2c 20  ons", "diskio", 
13160 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
13170 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
13180 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13190 54 5f 45 58 50 4c 41 49 4e 0a 20 20 54 63 6c 5f  T_EXPLAIN.  Tcl_
131a0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
131b0 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
131c0 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 22 30 22  , "explain", "0"
131d0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
131e0 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
131f0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
13200 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
13210 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 22 31 22  , "explain", "1"
13220 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
13230 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  Y);.#endif..#ifd
13240 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
13250 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
13260 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
13270 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
13280 6f 6e 73 22 2c 20 22 66 6c 6f 61 74 69 6e 67 70  ons", "floatingp
13290 6f 69 6e 74 22 2c 20 22 30 22 2c 20 54 43 4c 5f  oint", "0", TCL_
132a0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
132b0 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
132c0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
132d0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 66 6c 6f  e_options", "flo
132e0 61 74 69 6e 67 70 6f 69 6e 74 22 2c 20 22 31 22  atingpoint", "1"
132f0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
13300 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  Y);.#endif..#ifd
13310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
13320 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 63 6c  OREIGN_KEY.  Tcl
13330 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
13340 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
13350 22 2c 20 22 66 6f 72 65 69 67 6e 6b 65 79 22 2c  ", "foreignkey",
13360 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "0", TCL_GLOBAL
13370 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20  _ONLY);.#else.  
13380 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
13390 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
133a0 6f 6e 73 22 2c 20 22 66 6f 72 65 69 67 6e 6b 65  ons", "foreignke
133b0 79 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f  y", "1", TCL_GLO
133c0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  BAL_ONLY);.#endi
133d0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
133e0 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f  _OMIT_GLOBALRECO
133f0 56 45 52 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  VER.  Tcl_SetVar
13400 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
13410 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 67 6c 6f  e_options", "glo
13420 62 61 6c 72 65 63 6f 76 65 72 22 2c 20 22 30 22  balrecover", "0"
13430 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
13440 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
13450 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
13460 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
13470 2c 20 22 67 6c 6f 62 61 6c 72 65 63 6f 76 65 72  , "globalrecover
13480 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
13490 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
134a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
134b0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
134c0 48 45 43 4b 0a 20 20 54 63 6c 5f 53 65 74 56 61  HECK.  Tcl_SetVa
134d0 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
134e0 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 69 6e  te_options", "in
134f0 74 65 67 72 69 74 79 63 6b 22 2c 20 22 30 22 2c  tegrityck", "0",
13500 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
13510 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53  );.#else.  Tcl_S
13520 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
13530 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
13540 20 22 69 6e 74 65 67 72 69 74 79 63 6b 22 2c 20   "integrityck", 
13550 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
13560 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
13570 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13580 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 54 63 6c  T_MEMORYDB.  Tcl
13590 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
135a0 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
135b0 22 2c 20 22 6d 65 6d 6f 72 79 64 62 22 2c 20 22  ", "memorydb", "
135c0 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
135d0 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63  NLY);.#else.  Tc
135e0 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
135f0 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
13600 73 22 2c 20 22 6d 65 6d 6f 72 79 64 62 22 2c 20  s", "memorydb", 
13610 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
13620 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
13630 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13640 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
13650 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
13660 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
13670 74 69 6f 6e 73 22 2c 20 22 70 61 67 65 72 5f 70  tions", "pager_p
13680 72 61 67 6d 61 73 22 2c 20 22 30 22 2c 20 54 43  ragmas", "0", TC
13690 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
136a0 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
136b0 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
136c0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 70  ite_options", "p
136d0 61 67 65 72 5f 70 72 61 67 6d 61 73 22 2c 20 22  ager_pragmas", "
136e0 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  1", TCL_GLOBAL_O
136f0 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  NLY);.#endif..#i
13700 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
13710 5f 50 41 52 53 45 52 0a 20 20 54 63 6c 5f 53 65  _PARSER.  Tcl_Se
13720 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
13730 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
13740 22 70 61 72 73 65 72 22 2c 20 22 30 22 2c 20 54  "parser", "0", T
13750 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
13760 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74  .#else.  Tcl_Set
13770 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
13780 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
13790 70 61 72 73 65 72 22 2c 20 22 31 22 2c 20 54 43  parser", "1", TC
137a0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
137b0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
137c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
137d0 50 52 41 47 4d 41 29 20 7c 7c 20 64 65 66 69 6e  PRAGMA) || defin
137e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
137f0 4c 41 47 5f 50 52 41 47 4d 41 53 29 0a 20 20 54  LAG_PRAGMAS).  T
13800 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
13810 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
13820 6e 73 22 2c 20 22 70 72 61 67 6d 61 22 2c 20 22  ns", "pragma", "
13830 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
13840 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  NLY);.  Tcl_SetV
13850 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
13860 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 69  ite_options", "i
13870 6e 74 65 67 72 69 74 79 63 6b 22 2c 20 22 30 22  ntegrityck", "0"
13880 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
13890 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
138a0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
138b0 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
138c0 2c 20 22 70 72 61 67 6d 61 22 2c 20 22 31 22 2c  , "pragma", "1",
138d0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
138e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
138f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
13900 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
13910 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
13920 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
13930 74 69 6f 6e 73 22 2c 20 22 70 72 6f 67 72 65 73  tions", "progres
13940 73 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f  s", "0", TCL_GLO
13950 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65  BAL_ONLY);.#else
13960 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69  .  Tcl_SetVar2(i
13970 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
13980 70 74 69 6f 6e 73 22 2c 20 22 70 72 6f 67 72 65  ptions", "progre
13990 73 73 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c  ss", "1", TCL_GL
139a0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64  OBAL_ONLY);.#end
139b0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
139c0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 20  E_OMIT_REINDEX. 
139d0 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
139e0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
139f0 69 6f 6e 73 22 2c 20 22 72 65 69 6e 64 65 78 22  ions", "reindex"
13a00 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "0", TCL_GLOBA
13a10 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20  L_ONLY);.#else. 
13a20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
13a30 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
13a40 69 6f 6e 73 22 2c 20 22 72 65 69 6e 64 65 78 22  ions", "reindex"
13a50 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "1", TCL_GLOBA
13a60 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  L_ONLY);.#endif.
13a70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13a80 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d  MIT_SCHEMA_PRAGM
13a90 41 53 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  AS.  Tcl_SetVar2
13aa0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
13ab0 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 73 63 68 65  _options", "sche
13ac0 6d 61 5f 70 72 61 67 6d 61 73 22 2c 20 22 30 22  ma_pragmas", "0"
13ad0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
13ae0 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
13af0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
13b00 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
13b10 2c 20 22 73 63 68 65 6d 61 5f 70 72 61 67 6d 61  , "schema_pragma
13b20 73 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f  s", "1", TCL_GLO
13b30 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  BAL_ONLY);.#endi
13b40 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
13b50 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52  _OMIT_SCHEMA_VER
13b60 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 54  SION_PRAGMAS.  T
13b70 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
13b80 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
13b90 6e 73 22 2c 20 22 73 63 68 65 6d 61 5f 76 65 72  ns", "schema_ver
13ba0 73 69 6f 6e 22 2c 20 22 30 22 2c 20 54 43 4c 5f  sion", "0", TCL_
13bb0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
13bc0 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
13bd0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
13be0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 73 63 68  e_options", "sch
13bf0 65 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 20 22 31  ema_version", "1
13c00 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
13c10 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  LY);.#endif..#if
13c20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13c30 53 55 42 51 55 45 52 59 0a 20 20 54 63 6c 5f 53  SUBQUERY.  Tcl_S
13c40 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
13c50 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
13c60 20 22 73 75 62 71 75 65 72 79 22 2c 20 22 30 22   "subquery", "0"
13c70 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
13c80 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
13c90 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
13ca0 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
13cb0 2c 20 22 73 75 62 71 75 65 72 79 22 2c 20 22 31  , "subquery", "1
13cc0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
13cd0 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  LY);.#endif..#if
13ce0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13cf0 54 43 4c 5f 56 41 52 49 41 42 4c 45 0a 20 20 54  TCL_VARIABLE.  T
13d00 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
13d10 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
13d20 6e 73 22 2c 20 22 74 63 6c 76 61 72 22 2c 20 22  ns", "tclvar", "
13d30 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
13d40 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63  NLY);.#else.  Tc
13d50 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
13d60 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
13d70 73 22 2c 20 22 74 63 6c 76 61 72 22 2c 20 22 31  s", "tclvar", "1
13d80 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
13d90 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  LY);.#endif..#if
13da0 20 64 65 66 69 6e 65 64 28 54 48 52 45 41 44 53   defined(THREADS
13db0 41 46 45 29 20 26 26 20 54 48 52 45 41 44 53 41  AFE) && THREADSA
13dc0 46 45 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  FE.  Tcl_SetVar2
13dd0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
13de0 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 74 68 72 65  _options", "thre
13df0 61 64 73 61 66 65 22 2c 20 22 31 22 2c 20 54 43  adsafe", "1", TC
13e00 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
13e10 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
13e20 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
13e30 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 74  ite_options", "t
13e40 68 72 65 61 64 73 61 66 65 22 2c 20 22 30 22 2c  hreadsafe", "0",
13e50 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
13e60 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
13e70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
13e80 49 47 47 45 52 0a 20 20 54 63 6c 5f 53 65 74 56  IGGER.  Tcl_SetV
13e90 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
13ea0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 74  ite_options", "t
13eb0 72 69 67 67 65 72 22 2c 20 22 30 22 2c 20 54 43  rigger", "0", TC
13ec0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
13ed0 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
13ee0 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
13ef0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 74  ite_options", "t
13f00 72 69 67 67 65 72 22 2c 20 22 31 22 2c 20 54 43  rigger", "1", TC
13f10 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
13f20 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
13f30 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44  QLITE_OMIT_TEMPD
13f40 42 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  B.  Tcl_SetVar2(
13f50 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
13f60 6f 70 74 69 6f 6e 73 22 2c 20 22 74 65 6d 70 64  options", "tempd
13f70 62 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f  b", "0", TCL_GLO
13f80 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65  BAL_ONLY);.#else
13f90 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69  .  Tcl_SetVar2(i
13fa0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
13fb0 70 74 69 6f 6e 73 22 2c 20 22 74 65 6d 70 64 62  ptions", "tempdb
13fc0 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
13fd0 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
13fe0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13ff0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c  OMIT_UTF16.  Tcl
14000 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
14010 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
14020 22 2c 20 22 75 74 66 31 36 22 2c 20 22 30 22 2c  ", "utf16", "0",
14030 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
14040 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53  );.#else.  Tcl_S
14050 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
14060 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
14070 20 22 75 74 66 31 36 22 2c 20 22 31 22 2c 20 54   "utf16", "1", T
14080 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
14090 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
140a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
140b0 55 4d 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  UM.  Tcl_SetVar2
140c0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
140d0 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 76 61 63 75  _options", "vacu
140e0 75 6d 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c  um", "0", TCL_GL
140f0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73  OBAL_ONLY);.#els
14100 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  e.  Tcl_SetVar2(
14110 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
14120 6f 70 74 69 6f 6e 73 22 2c 20 22 76 61 63 75 75  options", "vacuu
14130 6d 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f  m", "1", TCL_GLO
14140 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  BAL_ONLY);.#endi
14150 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
14160 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 54 63 6c  _OMIT_VIEW.  Tcl
14170 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
14180 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
14190 22 2c 20 22 76 69 65 77 22 2c 20 22 30 22 2c 20  ", "view", "0", 
141a0 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
141b0 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65  ;.#else.  Tcl_Se
141c0 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
141d0 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
141e0 22 76 69 65 77 22 2c 20 22 31 22 2c 20 54 43 4c  "view", "1", TCL
141f0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
14200 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
14210 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
14220 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
14230 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
14240 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
14250 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
14260 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
14270 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
14280 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  rch_count;.  ext
14290 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
142a0 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b  interrupt_count;
142b0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
142c0 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
142d0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
142e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
142f0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
14300 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72   int sqlite3_cur
14310 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20 73 74 61  rent_time;.  sta
14320 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
14330 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
14340 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20      Tcl_CmdProc 
14350 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64  *xProc;.  } aCmd
14360 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73  [] = {.     { "s
14370 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
14380 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  nt",           (
14390 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
143a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
143b0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
143c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
143d0 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28  nt64",         (
143e0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
143f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
14400 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  64  },.     { "s
14410 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
14420 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  tr",           (
14430 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
14440 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
14450 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
14460 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
14470 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28  tronly",       (
14480 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
14490 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
144a0 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73  only},.     { "s
144b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
144c0 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28  ouble",        (
144d0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
144e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
144f0 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ble },.     { "s
14500 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
14510 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28  caled",        (
14520 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
14530 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
14540 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  led },.     { "s
14550 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a  qlite3_mprintf_z
14560 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28  _test",        (
14570 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
14580 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20  t_mprintf_z     
14590 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
145a0 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
145b0 74 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54  t_rowid",     (T
145c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
145d0 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20  _last_rowid     
145e0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
145f0 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
14600 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
14610 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
14620 65 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20  exec_printf     
14630 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
14640 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
14650 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c  intf",      (Tcl
14660 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67  _CmdProc*)test_g
14670 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20  et_table_printf 
14680 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
14690 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20  e3_close",      
146a0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
146b0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
146c0 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d  test_close     }
146d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
146e0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
146f0 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  n",       (Tcl_C
14700 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65  mdProc*)test_cre
14710 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c  ate_function  },
14720 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
14730 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
14740 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  e",      (Tcl_Cm
14750 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61  dProc*)test_crea
14760 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a  te_aggregate },.
14770 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72       { "sqlite_r
14780 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e  egister_test_fun
14790 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64  ction", (Tcl_Cmd
147a0 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73  Proc*)test_regis
147b0 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20  ter_func    },. 
147c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62      { "sqlite_ab
147d0 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ort",           
147e0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
147f0 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72  roc*)sqlite_abor
14800 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69  t          },.#i
14810 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  fdef SQLITE_MEMD
14820 45 42 55 47 0a 20 20 20 20 20 7b 20 22 73 71 6c  EBUG.     { "sql
14830 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 22  ite_malloc_fail"
14840 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ,            (Tc
14850 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
14860 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20 20 20  e_malloc_fail   
14870 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
14880 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 22 2c  te_malloc_stat",
14890 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
148a0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
148b0 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 20 20 20 20  _malloc_stat    
148c0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
148d0 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20   "sqlite_bind", 
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
14900 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20  test_bind       
14910 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
14920 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20  "breakpoint",   
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
14950 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20  est_breakpoint  
14960 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
14970 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20  sqlite3_key",   
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
149a0 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20  st_key          
149b0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
149c0 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20  qlite3_rekey",  
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
149e0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
149f0 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20  t_rekey         
14a00 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
14a10 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c  lite_set_magic",
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
14a30 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
14a40 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20  te_set_magic    
14a50 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
14a60 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c  ite3_interrupt",
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
14a80 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
14a90 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20  interrupt       
14aa0 20 7d 2c 0a 23 69 66 20 30 0a 20 20 20 20 20 7b   },.#if 0.     {
14ab0 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22   "sqlite3_sleep"
14ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14ad0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
14ae0 74 65 73 74 5f 73 6c 65 65 70 20 20 20 20 20 20  test_sleep      
14af0 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
14b00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64       { "sqlite_d
14b10 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c  elete_function",
14b20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
14b30 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e  Proc*)delete_fun
14b40 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20  ction       },. 
14b50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65      { "sqlite_de
14b60 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c  lete_collation",
14b70 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
14b80 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c  roc*)delete_coll
14b90 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20  ation      },.  
14ba0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65     { "sqlite3_ge
14bb0 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20  t_autocommit",  
14bc0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
14bd0 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  oc*)get_autocomm
14be0 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  it        },.  }
14bf0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
14c00 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
14c10 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
14c20 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
14c30 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
14c40 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
14c50 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
14c60 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
14c70 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
14c80 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
14c90 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ,      0 },.    
14ca0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
14cb0 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
14cc0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
14cd0 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  t64,    0 },.   
14ce0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
14cf0 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  d_double",      
14d00 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64       test_bind_d
14d10 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20  ouble,   0 },.  
14d20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
14d30 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20  nd_null",       
14d40 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
14d50 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20  null     ,0 },. 
14d60 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
14d70 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20  ind_text",      
14d80 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
14d90 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _text     ,0 },.
14da0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
14db0 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20  bind_text16",   
14dc0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
14dd0 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c  d_text16   ,0 },
14de0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
14df0 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20  _bind_blob",    
14e00 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
14e10 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d  nd_blob     ,0 }
14e20 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
14e30 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
14e40 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62  _count",  test_b
14e50 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
14e60 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  unt, 0},.     { 
14e70 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
14e80 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20  rameter_name",  
14e90 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
14ea0 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a  eter_name,  0},.
14eb0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
14ec0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
14ed0 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e  ndex",  test_bin
14ee0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
14ef0 78 2c 20 30 7d 2c 0a 23 69 66 20 30 0a 20 20 20  x, 0},.#if 0.   
14f00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65    { "sqlite3_cle
14f10 61 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20  ar_bindings",   
14f20 20 20 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f       test_clear_
14f30 62 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 23 65  bindings, 0},.#e
14f40 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
14f50 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20 20  ite3_errcode",  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
14f70 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20 20  t_errcode       
14f80 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
14f90 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c 20 20  lite3_errmsg",  
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
14fb0 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20 20 20  st_errmsg       
14fc0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
14fd0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 22  qlite3_errmsg16"
14fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
14ff0 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20 20 20  est_errmsg16    
15000 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
15010 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20 20  sqlite3_open",  
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20 20 20  test_open       
15040 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
15050 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 22  "sqlite3_open16"
15060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15070 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20 20 20   test_open16    
15080 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
15090 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65   "sqlite3_comple
150a0 74 65 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  te16",          
150b0 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31    test_complete1
150c0 36 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20  6    ,0 },..    
150d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
150e0 61 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  are",           
150f0 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
15100 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
15110 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
15120 70 61 72 65 31 36 22 2c 20 20 20 20 20 20 20 20  pare16",        
15130 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
15140 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e16     ,0 },.  
15150 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69     { "sqlite3_fi
15160 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20  nalize",        
15170 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c        test_final
15180 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  ize      ,0 },. 
15190 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
151a0 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
151b0 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65         test_rese
151c0 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  t         ,0 },.
151d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
151e0 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20  expired",       
151f0 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70          test_exp
15200 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c  ired       ,0 },
15210 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
15220 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
15230 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72  gs",     test_tr
15240 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d  ansfer_bind ,0 }
15250 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
15260 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  3_changes",     
15270 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
15280 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20  hanges       ,0 
15290 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
152a0 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20  e3_step",       
152b0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
152c0 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30  step          ,0
152d0 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c   },..     /* sql
152e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20  ite3_column_*() 
152f0 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73  API */.     { "s
15300 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
15310 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74  unt",          t
15320 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
15330 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
15340 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
15350 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
15360 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20  test_data_count 
15370 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
15380 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
15390 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
153a0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
153b0 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  e   ,0 },.     {
153c0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
153d0 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  _blob",         
153e0 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c    test_column_bl
153f0 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  ob   ,0 },.     
15400 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
15410 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  n_double",      
15420 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64     test_column_d
15430 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20  ouble ,0 },.    
15440 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
15450 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  mn_int64",      
15460 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
15470 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20  int64  ,0 },.   
15480 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
15490 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 20 20 20  umn_text",      
154a0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
154b0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
154c0 5f 74 65 78 74 20 20 20 20 20 20 7d 2c 0a 20 20  _text      },.  
154d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
154e0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 20  lumn_decltype", 
154f0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
15500 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ,  sqlite3_colum
15510 6e 5f 64 65 63 6c 74 79 70 65 20 20 7d 2c 0a 20  n_decltype  },. 
15520 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
15530 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 20  olumn_name",    
15540 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
15550 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  8,  sqlite3_colu
15560 6d 6e 5f 6e 61 6d 65 20 20 20 20 20 20 7d 2c 0a  mn_name      },.
15570 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
15580 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20  column_int",    
15590 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
155a0 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  t,   sqlite3_col
155b0 75 6d 6e 5f 69 6e 74 20 20 20 20 20 20 20 7d 2c  umn_int       },
155c0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
155d0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20  _column_bytes", 
155e0 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69       test_stmt_i
155f0 6e 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  nt,   sqlite3_co
15600 6c 75 6d 6e 5f 62 79 74 65 73 20 20 20 20 20 7d  lumn_bytes     }
15610 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
15620 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
15630 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
15640 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20 20 20  mn_bytes16",    
15650 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
15660 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
15670 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20 20 20  bytes16   },.   
15680 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
15690 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 20 20  umn_text16",    
156a0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
156b0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
156c0 5f 74 65 78 74 31 36 20 20 20 20 7d 2c 0a 20 20  _text16    },.  
156d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
156e0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22  lumn_decltype16"
156f0 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  , test_stmt_utf1
15700 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  6, sqlite3_colum
15710 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 20  n_decltype16},. 
15720 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
15730 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20  olumn_name16",  
15740 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
15750 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  16, sqlite3_colu
15760 6d 6e 5f 6e 61 6d 65 31 36 20 20 20 20 7d 2c 0a  mn_name16    },.
15770 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
15780 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
15790 63 6f 76 65 72 22 2c 20 20 20 20 74 65 73 74 5f  cover",    test_
157a0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20  global_recover, 
157b0 30 20 20 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20  0   },..     /* 
157c0 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f  Functions from o
157d0 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  s.h */.#ifndef S
157e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
157f0 4f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  O.     { "sqlite
15800 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
15810 22 2c 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  ",test_sqlite3Os
15820 4f 70 65 6e 52 65 61 64 57 72 69 74 65 2c 20 30  OpenReadWrite, 0
15830 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
15840 74 65 33 4f 73 43 6c 6f 73 65 22 2c 20 20 20 20  te3OsClose",    
15850 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33      test_sqlite3
15860 4f 73 43 6c 6f 73 65 2c 20 30 20 7d 2c 0a 20 20  OsClose, 0 },.  
15870 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 4c     { "sqlite3OsL
15880 6f 63 6b 22 2c 20 20 20 20 20 20 20 20 20 74 65  ock",         te
15890 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  st_sqlite3OsLock
158a0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
158b0 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
158c0 4e 61 6d 65 22 2c 20 74 65 73 74 5f 73 71 6c 69  Name", test_sqli
158d0 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
158e0 65 2c 20 30 20 7d 2c 0a 20 20 20 0a 20 20 20 20  e, 0 },.   .    
158f0 20 2f 2a 20 43 75 73 74 6f 6d 20 74 65 73 74 20   /* Custom test 
15900 69 6e 74 65 72 66 61 63 65 73 20 2a 2f 0a 20 20  interfaces */.  
15910 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 55     { "sqlite3OsU
15920 6e 6c 6f 63 6b 22 2c 20 20 20 20 20 20 20 20 20  nlock",         
15930 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e  test_sqlite3OsUn
15940 6c 6f 63 6b 2c 20 30 20 20 20 20 7d 2c 0a 23 65  lock, 0    },.#e
15950 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
15960 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
15970 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
15980 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20  collate",       
15990 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30   test_collate, 0
159a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
159b0 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
159c0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c  collate_needed",
159d0 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
159e0 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20  eded, 0     },. 
159f0 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
15a00 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
15a10 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20   test_function, 
15a20 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23  0           },.#
15a30 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
15a40 6c 69 74 65 33 5f 63 72 61 73 68 70 61 72 61 6d  lite3_crashparam
15a50 73 22 2c 20 20 20 20 20 73 71 6c 69 74 65 33 5f  s",     sqlite3_
15a60 63 72 61 73 68 70 61 72 61 6d 73 2c 20 30 20 20  crashparams, 0  
15a70 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
15a80 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74  lite3_test_errst
15a90 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72  r",     test_err
15aa0 73 74 72 2c 20 30 20 20 20 20 20 20 20 20 20 20  str, 0          
15ab0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63     },.     { "tc
15ac0 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22  l_variable_type"
15ad0 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69  ,       tcl_vari
15ae0 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20  able_type, 0    
15af0 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61     },.  };.  sta
15b00 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f  tic int bitmask_
15b10 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69  size = sizeof(Bi
15b20 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20  tmask)*8;.  int 
15b30 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  i;.  extern int 
15b40 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65  sqlite3_os_trace
15b50 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
15b60 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
15b70 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  t, sqlite3_fulls
15b80 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ync_count;.  ext
15b90 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
15ba0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a  opentemp_count;.
15bb0 20 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   ..  for(i=0; i<
15bc0 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a  sizeof(aCmd)/siz
15bd0 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b  eof(aCmd[0]); i+
15be0 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
15bf0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
15c00 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  , aCmd[i].zName,
15c10 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20   aCmd[i].xProc, 
15c20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  0, 0);.  }.  for
15c30 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
15c40 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  ObjCmd)/sizeof(a
15c50 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  ObjCmd[0]); i++)
15c60 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
15c70 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15c80 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e  p, aObjCmd[i].zN
15c90 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f  ame, .        aO
15ca0 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20  bjCmd[i].xProc, 
15cb0 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e  aObjCmd[i].clien
15cc0 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20  tData, 0);.  }. 
15cd0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
15ce0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61  erp, "sqlite_sea
15cf0 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  rch_count", .   
15d00 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
15d10 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c  e3_search_count,
15d20 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
15d30 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
15d40 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 6f  terp, "sqlite_so
15d50 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  rt_count", .    
15d60 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
15d70 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54 43  3_sort_count, TC
15d80 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
15d90 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
15da0 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72  p, "sqlite_inter
15db0 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  rupt_count", .  
15dc0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
15dd0 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
15de0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
15df0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
15e00 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
15e10 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
15e20 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
15e30 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  *)&sqlite3_open_
15e40 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  file_count, TCL_
15e50 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
15e60 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
15e70 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74   "sqlite_current
15e80 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28  _time", .      (
15e90 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63  char*)&sqlite3_c
15ea0 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c  urrent_time, TCL
15eb0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
15ec0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
15ed0 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61  , "sqlite_os_tra
15ee0 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ce",.      (char
15ef0 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72  *)&sqlite3_os_tr
15f00 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
15f10 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
15f20 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
15f30 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  e_opentemp_count
15f40 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
15f50 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d  &sqlite3_opentem
15f60 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  p_count, TCL_LIN
15f70 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
15f80 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
15f90 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
15fa0 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20  d_value",.      
15fb0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
15fc0 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
15fd0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
15fe0 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
15ff0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
16000 65 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  e_temp_directory
16010 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
16020 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  &sqlite3_temp_di
16030 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e  rectory, TCL_LIN
16040 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c  K_STRING);.  Tcl
16050 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
16060 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c   "bitmask_size",
16070 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 62  .      (char*)&b
16080 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c  itmask_size, TCL
16090 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49  _LINK_INT|TCL_LI
160a0 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23  NK_READ_ONLY);.#
160b0 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 54 63 6c  if OS_UNIX.  Tcl
160c0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
160d0 20 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f   "sqlite_sync_co
160e0 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
160f0 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63  r*)&sqlite3_sync
16100 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
16110 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
16120 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
16130 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  lite_fullsync_co
16140 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
16150 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c  r*)&sqlite3_full
16160 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sync_count, TCL_
16170 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
16180 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a  f /* OS_UNIX */.
16190 20 20 73 65 74 5f 6f 70 74 69 6f 6e 73 28 69 6e    set_options(in
161a0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
161b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a                    TCL_OK;.}.