/ Hex Artifact Content
Login

Artifact ad1b46266b357c283981b2a289cf29bdb35cb26a:


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 31 38 20 32 30 30 35 2f 30 31  ,v 1.118 2005/01
0240: 2f 31 31 20 31 35 3a 32 38 3a 33 33 20 64 72 68  /11 15:28:33 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 73 74 61 74 69  string.h>..stati
02c0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 65  c const char * e
02d0: 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  rrorName(int rc)
02e0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
02f0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 77 69  zName = 0;.  swi
0300: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63  tch( rc ){.    c
0310: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
0320: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0330: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
0340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0350: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
0360: 52 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  R:      zName = 
0370: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
0380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0390: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
03a0: 45 52 4e 41 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d  ERNAL:   zName =
03b0: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
03c0: 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
03d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
03e0: 52 4d 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  RM:       zName 
03f0: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
0400: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0410: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
0420: 42 4f 52 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65  BORT:      zName
0430: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
0440: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0450: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0460: 42 55 53 59 3a 20 20 20 20 20 20 20 7a 4e 61 6d  BUSY:       zNam
0470: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
0480: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
0490: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
04a0: 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 7a 4e 61  _LOCKED:     zNa
04b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
04c0: 4b 45 44 22 3b 20 20 20 20 20 20 62 72 65 61 6b  KED";      break
04d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
04e0: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 4e  E_NOMEM:      zN
04f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
0500: 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61  MEM";       brea
0510: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0520: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 7a  TE_READONLY:   z
0530: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
0540: 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 62 72 65  EADONLY";    bre
0550: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0560: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
0570: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0580: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 62 72  INTERRUPT";   br
0590: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
05a0: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
05b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
05c0: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 62  _IOERR";       b
05d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
05e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20  QLITE_CORRUPT:  
05f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0600: 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20  E_CORRUPT";     
0610: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0620: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a  SQLITE_NOTFOUND:
0630: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0640: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
0650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0660: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20   SQLITE_FULL:   
0670: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0680: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
0690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
06a0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
06b0: 4e 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  N:   zName = "SQ
06c0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
06d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
06e0: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
06f0: 4f 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  OL:   zName = "S
0700: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b  QLITE_PROTOCOL";
0710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0720: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
0730: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
0740: 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20  SQLITE_EMPTY";  
0750: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0760: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
0770: 4d 41 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  MA:     zName = 
0780: 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b  "SQLITE_SCHEMA";
0790: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
07a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
07b0: 42 49 47 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  BIG:     zName =
07c0: 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22   "SQLITE_TOOBIG"
07d0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
07e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
07f0: 4e 53 54 52 41 49 4e 54 3a 20 7a 4e 61 6d 65 20  NSTRAINT: zName 
0800: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
0810: 41 49 4e 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  AINT";  break;. 
0820: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
0830: 49 53 4d 41 54 43 48 3a 20 20 20 7a 4e 61 6d 65  ISMATCH:   zName
0840: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
0850: 54 43 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  TCH";    break;.
0860: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0870: 4d 49 53 55 53 45 3a 20 20 20 20 20 7a 4e 61 6d  MISUSE:     zNam
0880: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
0890: 53 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  SE";      break;
08a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
08b0: 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 7a 4e 61  _NOLFS:      zNa
08c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
08d0: 46 53 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  FS";       break
08e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
08f0: 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 7a 4e  E_AUTH:       zN
0900: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
0910: 54 48 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  TH";        brea
0920: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0930: 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 7a  TE_FORMAT:     z
0940: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
0950: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 62 72 65  ORMAT";      bre
0960: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0970: 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20  ITE_RANGE:      
0980: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0990: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 62 72  RANGE";       br
09a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
09b0: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
09c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
09d0: 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 62  _ROW";         b
09e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
09f0: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
0a00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0a10: 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20  E_DONE";        
0a20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0a30: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20  SQLITE_NOTADB:  
0a40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0a50: 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20  TE_NOTADB";     
0a60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
0a70: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  ult:            
0a80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0a90: 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20  ITE_Unknown";   
0aa0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
0ab0: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
0ac0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
0ad0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69   sqlite3_stmt* i
0ae0: 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e  nto an sqlite3*.
0af0: 20 20 54 68 69 73 20 64 65 70 65 6e 64 73 20 6f    This depends o
0b00: 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20 74 68  n the.** fact th
0b10: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20  at the sqlite3* 
0b20: 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69 65  is the first fie
0b30: 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65 20 73  ld in the Vdbe s
0b40: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65  tructure..*/.#de
0b50: 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28 58 29  fine StmtToDb(X)
0b60: 20 20 20 28 2a 28 73 71 6c 69 74 65 33 2a 2a 29     (*(sqlite3**)
0b70: 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  (X))../*.** Chec
0b80: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0b90: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0ba0: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0bb0: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0bc0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0bd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0be0: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0bf0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0c00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0c10: 20 72 63 29 7b 0a 20 20 69 66 28 20 72 63 21 3d   rc){.  if( rc!=
0c20: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26  SQLITE_MISUSE &&
0c30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
0c40: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
0c50: 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20  e(db)!=rc ){.   
0c60: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
0c70: 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71  .    int r2 = sq
0c80: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
0c90: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
0ca0: 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f 64 65  Buf, "error code
0cb0: 20 25 73 20 28 25 64 29 20 64 6f 65 73 20 6e 6f   %s (%d) does no
0cc0: 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65 33 5f  t match sqlite3_
0cd0: 65 72 72 63 6f 64 65 20 25 73 20 28 25 64 29 22  errcode %s (%d)"
0ce0: 2c 0a 20 20 20 20 20 20 20 65 72 72 6f 72 4e 61  ,.       errorNa
0cf0: 6d 65 28 72 63 29 2c 20 72 63 2c 20 65 72 72 6f  me(rc), rc, erro
0d00: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0d10: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0d20: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0d30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0d40: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0d50: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0d80: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0d90: 6e 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74  n sqlite3 object
0da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0db0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0dc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0dd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0de0: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0df0: 7b 0a 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c  {.  *ppDb = (sql
0e00: 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54 65 78  ite3*)sqlite3Tex
0e10: 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65  tToPtr(zA);.  re
0e20: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0e30: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0e40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0e50: 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74  ite3_stmt object
0e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0e70: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a  getStmtPointer(.
0e80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0e90: 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  terp, .  const c
0ea0: 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73  har *zArg,  .  s
0eb0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
0ec0: 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
0ed0: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
0ee0: 74 2a 29 73 71 6c 69 74 65 33 54 65 78 74 54 6f  t*)sqlite3TextTo
0ef0: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
0f00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
0f10: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f  *.** Decode a po
0f20: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
0f30: 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e  te3_stmt object.
0f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0f50: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 0a 20  etFilePointer(. 
0f60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0f70: 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  erp, .  const ch
0f80: 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 4f 73  ar *zArg,  .  Os
0f90: 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 0a 29 7b  File **ppFile.){
0fa0: 0a 20 20 2a 70 70 46 69 6c 65 20 3d 20 28 4f 73  .  *ppFile = (Os
0fb0: 46 69 6c 65 2a 29 73 71 6c 69 74 65 33 54 65 78  File*)sqlite3Tex
0fc0: 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a 20 20  tToPtr(zArg);.  
0fd0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
0fe0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
0ff0: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
1000: 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e  tation of a poin
1010: 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
1020: 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79  understood.** by
1030: 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e 74 65   the getDbPointe
1040: 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74  r and getVmPoint
1050: 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62 6f 76  er routines abov
1060: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  e..**.** The pro
1070: 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65  blem is, on some
1080: 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c 61 72   machines (Solar
1090: 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20 61 20  is) if you do a 
10a0: 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22  printf with.** "
10b0: 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74  %p" you cannot t
10c0: 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64 20 64  urn around and d
10d0: 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68 20 74  o a scanf with t
10e0: 68 65 20 73 61 6d 65 20 22 25 70 22 20 61 6e 64  he same "%p" and
10f0: 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70 6f 69  .** get your poi
1100: 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f 75 20  nter back.  You 
1110: 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e 64 20  have to prepend 
1120: 61 20 22 30 78 22 20 62 65 66 6f 72 65 20 69 74  a "0x" before it
1130: 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20   will.** work.  
1140: 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68 61 74  Or at least that
1150: 20 69 73 20 77 68 61 74 20 69 73 20 72 65 70 6f   is what is repo
1160: 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72 68 29  rted to me (drh)
1170: 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a 20 62  .  But this.** b
1180: 65 68 61 76 69 6f 72 20 76 61 72 69 65 73 20 66  ehavior varies f
1190: 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d  rom machine to m
11a0: 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c  achine.  The sol
11b0: 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72 20 69  ution used her i
11c0: 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  s.** to test the
11d0: 20 73 74 72 69 6e 67 20 72 69 67 68 74 20 61 66   string right af
11e0: 74 65 72 20 69 74 20 69 73 20 67 65 6e 65 72 61  ter it is genera
11f0: 74 65 64 20 74 6f 20 73 65 65 20 69 66 20 69 74  ted to see if it
1200: 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72   can be.** under
1210: 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66 2c 20  stood by scanf, 
1220: 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72 79 20  and if not, try 
1230: 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20 22 30  prepending an "0
1240: 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  x" to see if.** 
1250: 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49 66 20  that helps.  If 
1260: 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61  nothing works, a
1270: 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 73 20   fatal error is 
1280: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74  generated..*/.st
1290: 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 50 6f 69  atic int makePoi
12a0: 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
12b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72  rp *interp, char
12c0: 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29   *zPtr, void *p)
12d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
12e0: 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20  intf(100, zPtr, 
12f0: 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75  "%p", p);.  retu
1300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1310: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
1320: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c   routine for sql
1330: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1340: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1350: 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  t exec_printf_cb
1360: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
1370: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1380: 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29  gv, char **name)
1390: 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  {.  Tcl_DString 
13a0: 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72  *str = (Tcl_DStr
13b0: 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ing*)pArg;.  int
13c0: 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44   i;..  if( Tcl_D
13d0: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72  StringLength(str
13e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )==0 ){.    for(
13f0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1400: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
1410: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1420: 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f  t(str, name[i] ?
1430: 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c   name[i] : "NULL
1440: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1450: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1460: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
1470: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1480: 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d  ent(str, argv[i]
1490: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55   ? argv[i] : "NU
14a0: 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LL");.  }.  retu
14b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn 0;.}../*.** U
14c0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
14d0: 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20 20  xec_printf  DB  
14e0: 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a 2a  FORMAT  STRING.*
14f0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
1500: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
1510: 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20  ntf() interface 
1520: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
1530: 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20  atabase.** DB.  
1540: 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73  The SQL is the s
1550: 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54  tring FORMAT.  T
1560: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
1570: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
1580: 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e  ** one %s or %q.
1590: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20    STRING is the 
15a0: 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69  value inserted i
15b0: 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f  nto %s or %q..*/
15c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15d0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20  _exec_printf(.  
15e0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
15f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1600: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1610: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1620: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1630: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1640: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
1650: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1660: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1670: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
1680: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
1690: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
16a0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
16b0: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
16c0: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
16d0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
16e0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
16f0: 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  l;.  char zBuf[3
1700: 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  0];.  if( argc!=
1710: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1720: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1730: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1740: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1750: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1760: 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52   " DB FORMAT STR
1770: 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ING", 0);.    re
1780: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1790: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
17a0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
17b0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
17c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
17e0: 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c  it(&str);.  zSql
17f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1800: 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76  tf(argv[2], argv
1810: 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  [3]);.  rc = sql
1820: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
1830: 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f  ql, exec_printf_
1840: 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29  cb, &str, &zErr)
1850: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1860: 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74  (zSql);.  sprint
1870: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  f(zBuf, "%d", rc
1880: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
1890: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
18a0: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
18b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
18c0: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
18d0: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
18e0: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
18f0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
1900: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
1910: 20 7a 45 72 72 20 29 20 66 72 65 65 28 7a 45 72   zErr ) free(zEr
1920: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
1930: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1940: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1950: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1960: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1980: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
1990: 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41 52  tf_z_test  SEPAR
19a0: 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47 31  ATOR  ARG0  ARG1
19b0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20   ....**.** Test 
19c0: 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66  the %z format of
19d0: 20 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65   mprintf().  Use
19e0: 20 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74   multiple mprint
19f0: 66 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  f() calls to .**
1a00: 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67   concatenate arg
1a10: 30 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75  0 through argn u
1a20: 73 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61  sing separator a
1a30: 73 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e  s the separator.
1a40: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1a50: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
1a60: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
1a70: 66 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_z(.  void *Not
1a80: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
1a90: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1aa0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1ab0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1ac0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1ad0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1af0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1b00: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
1b10: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
1b20: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
1b30: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
1b40: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20  char *zResult = 
1b50: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  0;.  int i;..  f
1b60: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20  or(i=2; i<argc; 
1b70: 69 2b 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c  i++){.    zResul
1b80: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1b90: 74 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65  tf("%z%s%s", zRe
1ba0: 73 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61  sult, argv[1], a
1bb0: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54  rgv[i]);.  }.  T
1bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bd0: 69 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c  interp, zResult,
1be0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
1bf0: 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  e(zResult);.  re
1c00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1c20: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
1c30: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
1c40: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
1c50: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
1c60: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
1c70: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1c80: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1c90: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1ca0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1cb0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1cc0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1cd0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1ce0: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1cf0: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1d00: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1d10: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1d20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d30: 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
1d40: 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tf(.  void *NotU
1d50: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
1d60: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1d70: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1d80: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1d90: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1da0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
1db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dc0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1dd0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
1de0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
1df0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
1e00: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
1e10: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63  qlite3 *db;.  Tc
1e20: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
1e30: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
1e40: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74  *zErr = 0;.  int
1e50: 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63   nRow, nCol;.  c
1e60: 68 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20  har **aResult;. 
1e70: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a   int i;.  char z
1e80: 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20  Buf[30];.  char 
1e90: 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 61 72 67  *zSql;.  if( arg
1ea0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1eb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ec0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ed0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ee0: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1ef0: 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20      " DB FORMAT 
1f00: 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20  STRING", 0);.   
1f10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f20: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f30: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f40: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1f50: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f60: 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  OR;.  Tcl_DStrin
1f70: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a  gInit(&str);.  z
1f80: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1f90: 72 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72  rintf(argv[2],ar
1fa0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
1fb0: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
1fc0: 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73  (db, zSql, &aRes
1fd0: 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f  ult, &nRow, &nCo
1fe0: 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c  l, &zErr);.  sql
1ff0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2000: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
2010: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
2020: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
2030: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
2040: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2050: 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  OK ){.    sprint
2060: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52  f(zBuf, "%d", nR
2070: 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ow);.    Tcl_App
2080: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2090: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 73 70  p, zBuf);.    sp
20a0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
20b0: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 54 63 6c  , nCol);.    Tcl
20c0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
20d0: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
20e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 52    for(i=0; i<(nR
20f0: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69 2b 2b 29  ow+1)*nCol; i++)
2100: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
2110: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2120: 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20 61  , aResult[i] ? a
2130: 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55 4c  Result[i] : "NUL
2140: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  L");.    }.  }el
2150: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  se{.    Tcl_Appe
2160: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2170: 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  , zErr);.  }.  s
2180: 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c  qlite3_free_tabl
2190: 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69 66  e(aResult);.  if
21a0: 28 20 7a 45 72 72 20 29 20 66 72 65 65 28 7a 45  ( zErr ) free(zE
21b0: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
21c0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
21d0: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
21e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21f0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2200: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
2210: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73  ge:  sqlite3_las
2220: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44  t_insert_rowid D
2230: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
2240: 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49  the integer ROWI
2250: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
2260: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a  cent insert..*/.
2270: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2280: 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f  last_rowid(.  vo
2290: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
22a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
22c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
22d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
22e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
22f0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2300: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2310: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2320: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2330: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2340: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2350: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2360: 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
2370: 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  30];..  if( argc
2380: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
2390: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23a0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
23b0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
23c0: 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c  , argv[0], " DB\
23d0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
23e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23f0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2400: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
2410: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
2420: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2430: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
2440: 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c  %lld", sqlite3_l
2450: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2460: 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70  (db));.  Tcl_App
2470: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2480: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
2490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
24b0: 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44 42 20   sqlite3_key DB 
24c0: 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  KEY.**.** Set th
24d0: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
24e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
24f0: 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  key(.  void *Not
2500: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2510: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2520: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2530: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2540: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2550: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2570: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2580: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2590: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
25a0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
25b0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
25c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
25d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
25e0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
25f0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
2600: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2610: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2620: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2630: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
2640: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
2650: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
2660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2680: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2690: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
26a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26b0: 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76  R;.  zKey = argv
26c0: 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74  [2];.  nKey = st
26d0: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64  rlen(zKey);.#ifd
26e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
26f0: 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65  DEC.  sqlite3_ke
2700: 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  y(db, zKey, nKey
2710: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
2720: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2730: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
2740: 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59  te3_rekey DB KEY
2750: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  .**.** Change th
2760: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
2770: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2780: 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  rekey(.  void *N
2790: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
27a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
27b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
27c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
27d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
27e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2800: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2810: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2820: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2830: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2840: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2850: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2860: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
2870: 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  y;.  int nKey;. 
2880: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
2890: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
28a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
28b0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
28c0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
28d0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
28e0: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
28f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2900: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2910: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2920: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2930: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2940: 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72  ROR;.  zKey = ar
2950: 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20  gv[2];.  nKey = 
2960: 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69  strlen(zKey);.#i
2970: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
2980: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
2990: 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20  rekey(db, zKey, 
29a0: 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
29b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
29c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
29d0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 44 42  sqlite3_close DB
29e0: 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68  .**.** Closes th
29f0: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
2a00: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65  d by sqlite3_ope
2a10: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2a20: 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f   sqlite_test_clo
2a30: 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  se(.  void *NotU
2a40: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
2a50: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2a60: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2a70: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2a80: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2a90: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
2aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ab0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2ac0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
2ad0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
2ae0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
2af0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
2b00: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2b10: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
2b20: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
2b30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2b40: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2b50: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2b60: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
2b70: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
2b80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2b90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ba0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2bb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2bc0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2bd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
2be0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
2bf0: 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  (db);.  Tcl_SetR
2c00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2c10: 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28  har *)errorName(
2c20: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
2c30: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2c40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  K;.}../*.** Impl
2c50: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2c60: 65 20 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66  e x_coalesce() f
2c70: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  unction..** Retu
2c80: 72 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 67  rn the first arg
2c90: 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  ument non-NULL a
2ca0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
2cb0: 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75  ic void ifnullFu
2cc0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
2cd0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
2ce0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2cf0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
2d00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
2d10: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
2d20: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
2d30: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
2d40: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
2d50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d60: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
2d70: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
2d80: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
2d90: 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20  ]), -1,.        
2da0: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
2db0: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
2dc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2dd0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
2de0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61   into which to a
2df0: 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a  ccumulate text..
2e00: 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b  */.struct dstr {
2e10: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
2e20: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
2e30: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65  ed */.  int nUse
2e40: 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73  d;   /* Space us
2e50: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
2e60: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63       /* The spac
2e70: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
2e80: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
2e90: 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dstr.*/.static v
2ea0: 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73  oid dstrAppend(s
2eb0: 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63  truct dstr *p, c
2ec0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
2ed0: 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e  t divider){.  in
2ee0: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  t n = strlen(z);
2ef0: 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20  .  if( p->nUsed 
2f00: 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c  + n + 2 > p->nAl
2f10: 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20  loc ){.    char 
2f20: 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41  *zNew;.    p->nA
2f30: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  lloc = p->nAlloc
2f40: 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20  *2 + n + 200;.  
2f50: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    zNew = sqliteR
2f60: 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e  ealloc(p->z, p->
2f70: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
2f80: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
2f90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
2fa0: 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  z);.      memset
2fb0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
2fc0: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
2fd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a  ;.    }.    p->z
2fe0: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = zNew;.  }.  i
2ff0: 66 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d  f( divider && p-
3000: 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20  >nUsed>0 ){.    
3010: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  p->z[p->nUsed++]
3020: 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a   = divider;.  }.
3030: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70    memcpy(&p->z[p
3040: 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31  ->nUsed], z, n+1
3050: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
3060: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   n;.}../*.** Inv
3070: 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61  oked for each ca
3080: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69  llback from sqli
3090: 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73  te3ExecFunc.*/.s
30a0: 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75  tatic int execFu
30b0: 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ncCallback(void 
30c0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
30d0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
30e0: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
30f0: 20 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70    struct dstr *p
3100: 20 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a   = (struct dstr*
3110: 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b  )pData;.  int i;
3120: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
3130: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
3140: 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( argv[i]==0 ){.
3150: 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64        dstrAppend
3160: 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29  (p, "NULL", ' ')
3170: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3180: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
3190: 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a   argv[i], ' ');.
31a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
31c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
31d0: 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78   the x_sqlite_ex
31e0: 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ec() function.  
31f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
3200: 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  kes.** a single 
3210: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74  argument and att
3220: 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65  empts to execute
3230: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61   that argument a
3240: 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54  s SQL code..** T
3250: 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61  his is illegal a
3260: 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68  nd should set th
3270: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
3280: 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61  flag on the data
3290: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  base..**.** 2004
32a0: 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76  -Jan-07:  We hav
32b0: 65 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74  e changed this t
32c0: 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20  o make it legal 
32d0: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
32e0: 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77  exec().** from w
32f0: 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e  ithin a function
3300: 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20   call.  .** .** 
3310: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d  This routine sim
3320: 75 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63  ulates the effec
3330: 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20  t of having two 
3340: 74 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20  threads attempt 
3350: 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61  to.** use the sa
3360: 6d 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  me database at t
3370: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f  he same time..*/
3380: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3390: 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20  ite3ExecFunc(.  
33a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
33b0: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
33c0: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
33d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
33e0: 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72  ){.  struct dstr
33f0: 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c   x;.  memset(&x,
3400: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
3410: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28    sqlite3_exec((
3420: 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33  sqlite3*)sqlite3
3430: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
3440: 78 74 29 2c 0a 20 20 20 20 20 20 73 71 6c 69 74  xt),.      sqlit
3450: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
3460: 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65 78  gv[0]),.      ex
3470: 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20  ecFuncCallback, 
3480: 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  &x, 0);.  sqlite
3490: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
34a0: 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55  ntext, x.z, x.nU
34b0: 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  sed, SQLITE_TRAN
34c0: 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
34d0: 46 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a  Free(x.z);.}../*
34e0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
34f0: 74 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 66  te_test_create_f
3500: 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a  unction DB.**.**
3510: 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
3520: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
3530: 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76  n API on the giv
3540: 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  en database in o
3550: 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74  rder.** to creat
3560: 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  e a function nam
3570: 65 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e  ed "x_coalesce".
3580: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
3590: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68  does the same th
35a0: 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63  ing.** as the "c
35b0: 6f 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f  oalesce" functio
35c0: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
35d0: 6e 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73  n also registers
35e0: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
35f0: 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c  .** named "x_sql
3600: 69 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69  ite_exec" that i
3610: 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65  nvokes sqlite3_e
3620: 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67  xec().  Invoking
3630: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
3640: 2a 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69  ** in this way i
3650: 73 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73  s illegal recurs
3660: 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72  ion and should r
3670: 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d  aise an SQLITE_M
3680: 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20  ISUSE error..** 
3690: 54 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69  The effect is si
36a0: 6d 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20  milar to trying 
36b0: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
36c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
36d0: 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  ion from.** two 
36e0: 74 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73  threads at the s
36f0: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
3700: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
3710: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
3720: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
3730: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
3740: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
3750: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66  reate_function f
3760: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20  unction while a 
3770: 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67  query is in prog
3780: 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ress in order.**
3790: 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c   to test the SQL
37a0: 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63  ITE_MISUSE detec
37b0: 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  tion logic..*/.s
37c0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
37d0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
37e0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
37f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3800: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3810: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3820: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3830: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3840: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3850: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3860: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3870: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3890: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
38a0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
38b0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
38c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
38d0: 65 20 2a 70 56 61 6c 3b 0a 20 20 65 78 74 65 72  e *pVal;.  exter
38e0: 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73  n void Md5_Regis
38f0: 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a  ter(sqlite3*);..
3900: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
3910: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3920: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3930: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3940: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3950: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49  [0],.       " FI
3960: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
3970: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3980: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
3990: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
39a0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
39b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
39c0: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
39d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
39e0: 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c  tion(db, "x_coal
39f0: 65 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54  esce", -1, SQLIT
3a00: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
3a10: 20 20 20 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30     ifnullFunc, 0
3a20: 2c 20 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  , 0);..#ifndef S
3a30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
3a40: 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71  .  /* Use the sq
3a50: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
3a60: 63 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65  ction16() API he
3a70: 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66  re. Mainly for f
3a80: 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20  un, but also .  
3a90: 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73  ** because it is
3aa0: 20 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77   not tested anyw
3ab0: 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20  here else. */.  
3ac0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3ad0: 4b 20 29 7b 0a 20 20 20 20 70 56 61 6c 20 3d 20  K ){.    pVal = 
3ae0: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
3af0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
3b00: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
3b10: 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78  -1, "x_sqlite_ex
3b20: 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ec", SQLITE_UTF8
3b30: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
3b40: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
3b50: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
3b60: 6f 6e 31 36 28 64 62 2c 20 0a 20 20 20 20 20 20  on16(db, .      
3b70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3b80: 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
3b90: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
3ba0: 45 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E),.            
3bb0: 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31    1, SQLITE_UTF1
3bc0: 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78  6, db, sqlite3Ex
3bd0: 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  ecFunc, 0, 0);. 
3be0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
3bf0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 23  ree(pVal);.  }.#
3c00: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c  endif..  if( sql
3c10: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
3c20: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
3c30: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3c40: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
3c50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
3c60: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
3c70: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
3c80: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
3c90: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
3ca0: 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78   struct CountCtx
3cb0: 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63   CountCtx;.struc
3cc0: 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69  t CountCtx {.  i
3cd0: 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20  nt n;.};.static 
3ce0: 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73  void countStep(s
3cf0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3d00: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
3d10: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
3d20: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e   **argv){.  Coun
3d30: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
3d40: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3d50: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
3d60: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
3d70: 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c   if( (argc==0 ||
3d80: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
3d90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
3da0: 28 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70  (argv[0]) ) && p
3db0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a   ){.    p->n++;.
3dc0: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
3dd0: 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69  void countFinali
3de0: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
3df0: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
3e00: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
3e10: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
3e20: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
3e30: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
3e40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
3e50: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
3e60: 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a   p ? p->n : 0);.
3e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
3e80: 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65   sqlite_test_cre
3e90: 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 44 42  ate_aggregate DB
3ea0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
3eb0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
3ec0: 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74  unction API on t
3ed0: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
3ee0: 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  e in order.** to
3ef0: 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69   create a functi
3f00: 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e  on named "x_coun
3f10: 74 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  t".  This functi
3f20: 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  on does the same
3f30: 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65   thing.** as the
3f40: 20 22 6d 64 35 73 75 6d 22 20 66 75 6e 63 74 69   "md5sum" functi
3f50: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  on..**.** The or
3f60: 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f  iginal motivatio
3f70: 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  n for this routi
3f80: 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c  ne was to be abl
3f90: 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a  e to call the.**
3fa0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
3fb0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
3fc0: 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79  on while a query
3fd0: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
3fe0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74  in order.** to t
3ff0: 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  est the SQLITE_M
4000: 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20  ISUSE detection 
4010: 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
4020: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
4030: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f  _aggregate(.  vo
4040: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4050: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4060: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4070: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4080: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4090: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
40a0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
40b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
40c0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
40d0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
40e0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
40f0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
4100: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
4110: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
4120: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
4130: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4140: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4150: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4160: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4170: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
4180: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
4190: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
41a0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
41b0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
41c0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
41d0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
41e0: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
41f0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
4200: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
4210: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
4220: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 63 6f  , 0, 0,.      co
4230: 75 6e 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e  untStep,countFin
4240: 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  alize);.  if( rc
4250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4260: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
4270: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
4280: 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c  x_count", 1, SQL
4290: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
42a0: 20 20 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65          countSte
42b0: 70 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29  p,countFinalize)
42c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
42d0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
42e0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
42f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4300: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
4310: 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55  OK;.}..../*.** U
4320: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
4330: 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41  printf_int FORMA
4340: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
4350: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
4360: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
4370: 68 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20  h three integer 
4380: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
4390: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
43a0: 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76  mprintf_int(.  v
43b0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
43c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
43d0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
43e0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
43f0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4400: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4410: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
4420: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4430: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
4440: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
4450: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4460: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
4470: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d  */.){.  int a[3]
4480: 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  , i;.  char *z;.
4490: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
44a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
44b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
44c0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
44d0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
44e0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
44f0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
4500: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4510: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4520: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
4530: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
4540: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
4550: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
4560: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
4570: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
4580: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
4590: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
45a0: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
45b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
45c0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
45d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
45e0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
45f0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  L_OK;.}../*.** I
4600: 66 20 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74  f zNum represent
4610: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
4620: 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 36 34  t will fit in 64
4630: 2d 62 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a  -bits, then set.
4640: 2a 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68  ** *pValue to th
4650: 61 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72  at integer and r
4660: 65 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68  eturn true.  Oth
4670: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61  erwise return fa
4680: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
4690: 6e 74 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  nt sqlite3GetInt
46a0: 36 34 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  64(const char *z
46b0: 4e 75 6d 2c 20 69 36 34 20 2a 70 56 61 6c 75 65  Num, i64 *pValue
46c0: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
46d0: 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 4e 75  FitsIn64Bits(zNu
46e0: 6d 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m) ){.    sqlite
46f0: 33 61 74 6f 69 36 34 28 7a 4e 75 6d 2c 20 70 56  3atoi64(zNum, pV
4700: 61 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72  alue);.    retur
4710: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
4720: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  n 0;.}../*.** Us
4730: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
4740: 72 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d  rintf_int64 FORM
4750: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
4760: 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a  ER INTEGER.**.**
4770: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
4780: 74 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20  th three 64-bit 
4790: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
47a0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
47b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
47c0: 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e  int64(.  void *N
47d0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
47e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
47f0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
4800: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
4810: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
4820: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4840: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
4850: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
4860: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
4870: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
4880: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
4890: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
48a0: 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20  e_int64 a[3];.  
48b0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
48c0: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
48d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
48e0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
48f0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4900: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4910: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
4920: 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29  T INT INT\"", 0)
4930: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4940: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
4950: 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=2; i<5; i++)
4960: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
4970: 65 33 47 65 74 49 6e 74 36 34 28 61 72 67 76 5b  e3GetInt64(argv[
4980: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a  i], &a[i-2]) ){.
4990: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
49a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
49b0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
49c0: 61 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69  a valid 64-bit i
49d0: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
49e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
49f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
4a00: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
4a10: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b  intf(argv[1], a[
4a20: 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b  0], a[1], a[2]);
4a30: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
4a40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
4a50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
4a60: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
4a70: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
4a80: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4a90: 6d 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d  mprintf_str FORM
4aa0: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
4ab0: 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  ER STRING.**.** 
4ac0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
4ad0: 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72  h two integer ar
4ae0: 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20  guments and one 
4af0: 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a  string argument.
4b00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4b10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
4b20: 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  r(.  void *NotUs
4b30: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4b40: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4b50: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4b60: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4b70: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4b80: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4ba0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4bb0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
4bc0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
4bd0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
4be0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
4bf0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
4c00: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
4c10: 3c 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a  <4 || argc>5 ){.
4c20: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4c30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4c40: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4c50: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4c60: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
4c70: 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52  MAT INT INT ?STR
4c80: 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20  ING?\"", 0);.   
4c90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4ca0: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
4cb0: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
4cc0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
4cd0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
4ce0: 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75   &a[i-2]) ) retu
4cf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4d00: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  }.  z = sqlite3_
4d10: 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c  mprintf(argv[1],
4d20: 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67   a[0], a[1], arg
4d30: 63 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20  c>4 ? argv[4] : 
4d40: 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70  NULL);.  Tcl_App
4d50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4d60: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
4d70: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
4d80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4d90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4da0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
4db0: 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  r FORMAT INTEGER
4dc0: 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a   INTEGER DOUBLE.
4dd0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
4de0: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
4df0: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
4e00: 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67  d one double arg
4e10: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
4e20: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
4e30: 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  ntf_double(.  vo
4e40: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4e50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4e60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4e70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4e80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4e90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
4ea0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4eb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4ec0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
4ed0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4ee0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
4ef0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
4f00: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c  /.){.  int a[3],
4f10: 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a   i;.  double r;.
4f20: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
4f30: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
4f40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4f50: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
4f60: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
4f70: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
4f80: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
4f90: 49 4e 54 20 49 4e 54 20 53 54 52 49 4e 47 5c 22  INT INT STRING\"
4fa0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4fb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4fc0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b  .  for(i=2; i<4;
4fd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
4fe0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
4ff0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
5000: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
5010: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
5020: 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28  ( Tcl_GetDouble(
5030: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c  interp, argv[4],
5040: 20 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43   &r) ) return TC
5050: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73  L_ERROR;.  z = s
5060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
5070: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
5080: 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70  1], r);.  Tcl_Ap
5090: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
50a0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
50b0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
50c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
50d0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
50e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
50f0: 74 72 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45  tr FORMAT DOUBLE
5100: 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61   DOUBLE.**.** Ca
5110: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
5120: 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20  a single double 
5130: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
5140: 73 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66  s the product of
5150: 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75   the.** two argu
5160: 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76  ments given abov
5170: 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
5180: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65   to generate ove
5190: 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66  rflow and underf
51a0: 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74  low.** doubles t
51b0: 6f 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79  o test that they
51c0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70   are converted p
51d0: 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74  roperly..*/.stat
51e0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
51f0: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
5200: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
5210: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
5220: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
5230: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
5240: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
5250: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
5260: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
5270: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5280: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
5290: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
52a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
52b0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
52c0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
52d0: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
52e0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
52f0: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
5300: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5310: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5320: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5330: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
5340: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
5350: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
5360: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
5370: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
5380: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
5390: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
53a0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
53b0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
53c0: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
53d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
53e0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
53f0: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
5400: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
5410: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5420: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
5430: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
5440: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
5450: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
5460: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
5470: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
5480: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
5490: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
54a0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
54b0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
54c0: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
54d0: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
54e0: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
54f0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
5500: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
5510: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
5520: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
5530: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
5540: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
5550: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
5560: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
5570: 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20  intf_stronly(.  
5580: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
5590: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
55a0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
55b0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
55c0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
55d0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
55e0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
55f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5600: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5610: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5620: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
5630: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5640: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
5650: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
5660: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
5670: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5680: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
5690: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
56a0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
56b0: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22  FORMAT STRING\""
56c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
56d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
56e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
56f0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
5700: 72 67 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  rgv[2]);.  Tcl_A
5710: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5720: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
5730: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
5740: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
5750: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
5760: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
5770: 6c 20 4e 20 20 3f 52 45 50 45 41 54 2d 49 4e 54  l N  ?REPEAT-INT
5780: 45 52 56 41 4c 3f 0a 2a 2a 0a 2a 2a 20 52 69 67  ERVAL?.**.** Rig
5790: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
57a0: 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 4e  to fail on the N
57b0: 2d 74 68 20 63 61 6c 6c 20 61 6e 64 20 65 76 65  -th call and eve
57c0: 72 79 20 52 45 50 45 41 54 2d 49 4e 54 45 52 56  ry REPEAT-INTERV
57d0: 41 4c 20 63 61 6c 6c 0a 2a 2a 20 61 66 74 65 72  AL call.** after
57e0: 20 74 68 61 74 2e 20 20 49 66 20 52 45 50 45 41   that.  If REPEA
57f0: 54 2d 49 4e 54 45 52 56 41 4c 20 69 73 20 30 20  T-INTERVAL is 0 
5800: 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74  or is omitted, t
5810: 68 65 6e 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  hen only a singl
5820: 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 77 69 6c 6c  e.** malloc will
5830: 20 66 61 69 6c 2e 20 20 49 66 20 52 45 50 45 41   fail.  If REPEA
5840: 54 2d 49 4e 54 45 52 56 41 4c 20 69 73 20 31 20  T-INTERVAL is 1 
5850: 74 68 65 6e 20 61 6c 6c 20 6d 61 6c 6c 6f 63 73  then all mallocs
5860: 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 66 69   after the.** fi
5870: 72 73 74 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  rst failure will
5880: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 66 61 69   continue to fai
5890: 6c 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e  l on every call.
58a0: 20 20 49 66 20 52 45 50 45 41 54 2d 49 4e 54 45    If REPEAT-INTE
58b0: 52 56 41 4c 20 69 73 0a 2a 2a 20 32 20 74 68 65  RVAL is.** 2 the
58c0: 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20 6d 61  n every other ma
58d0: 6c 6c 6f 63 20 77 69 6c 6c 20 66 61 69 6c 2e 20  lloc will fail. 
58e0: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   And so forth..*
58f0: 2a 0a 2a 2a 20 54 75 72 6e 20 6f 66 66 20 74 68  *.** Turn off th
5900: 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64  is mechanism and
5910: 20 72 65 73 65 74 20 74 68 65 20 73 71 6c 69 74   reset the sqlit
5920: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
5930: 20 76 61 72 69 61 62 6c 65 20 69 73 20 4e 3d 3d   variable is N==
5940: 30 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  0..*/.#ifdef SQL
5950: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5960: 20 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   int sqlite_mall
5970: 6f 63 5f 66 61 69 6c 28 0a 20 20 76 6f 69 64 20  oc_fail(.  void 
5980: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5990: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
59a0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
59b0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
59c0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
59d0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
59e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
59f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5a00: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
5a10: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
5a20: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
5a30: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
5a40: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  {.  int n;.  int
5a50: 20 72 65 70 3b 0a 20 20 69 66 28 20 61 72 67 63   rep;.  if( argc
5a60: 21 3d 32 20 26 26 20 61 72 67 63 21 3d 33 20 29  !=2 && argc!=3 )
5a70: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
5a80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
5a90: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
5aa0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
5ab0: 76 5b 30 5d 2c 20 22 20 4e 5c 22 22 2c 20 30 29  v[0], " N\"", 0)
5ac0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
5ad0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
5ae0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
5af0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
5b00: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
5b10: 52 52 4f 52 3b 0a 20 20 69 66 28 20 61 72 67 63  RROR;.  if( argc
5b20: 3d 3d 33 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==3 ){.    if( T
5b30: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
5b40: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 72 65 70 29  , argv[2], &rep)
5b50: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
5b60: 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
5b70: 20 20 72 65 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    rep = 0;.  }. 
5b80: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
5b90: 46 61 69 6c 20 3d 20 6e 3b 0a 20 20 73 71 6c 69  Fail = n;.  sqli
5ba0: 74 65 33 5f 69 4d 61 6c 6c 6f 63 52 65 73 65 74  te3_iMallocReset
5bb0: 20 3d 20 72 65 70 3b 0a 20 20 73 71 6c 69 74 65   = rep;.  sqlite
5bc0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
5bd0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  = 0;.  return TC
5be0: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
5bf0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
5c00: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 0a  ite_malloc_stat.
5c10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
5c20: 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72   number of prior
5c30: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
5c40: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 73 71 6c  Malloc() and sql
5c50: 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 23 69  iteFree()..*/.#i
5c60: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5c70: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  G.static int sql
5c80: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 28  ite_malloc_stat(
5c90: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
5ca0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
5cb0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
5cc0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
5cd0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
5ce0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
5cf0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
5d00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5d10: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
5d20: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
5d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
5d40: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5d50: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
5d60: 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 73 70   zBuf[200];.  sp
5d70: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 20  rintf(zBuf, "%d 
5d80: 25 64 20 25 64 22 2c 20 73 71 6c 69 74 65 33 5f  %d %d", sqlite3_
5d90: 6e 4d 61 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33  nMalloc, sqlite3
5da0: 5f 6e 46 72 65 65 2c 20 73 71 6c 69 74 65 33 5f  _nFree, sqlite3_
5db0: 69 4d 61 6c 6c 6f 63 46 61 69 6c 29 3b 0a 20 20  iMallocFail);.  
5dc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5dd0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
5de0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
5df0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
5e00: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
5e10: 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53  te_abort.**.** S
5e20: 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f 63  hutdown the proc
5e30: 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ess immediately.
5e40: 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20    This is not a 
5e50: 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a  clean shutdown..
5e60: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
5e70: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
5e80: 74 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c 69  the recoverabili
5e90: 74 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ty of a database
5ea0: 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74   in.** the event
5eb0: 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63 72   of a program cr
5ec0: 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ash..*/.static i
5ed0: 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 28  nt sqlite_abort(
5ee0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
5ef0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
5f00: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
5f10: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
5f20: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
5f30: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
5f40: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
5f50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5f60: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
5f70: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
5f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
5f90: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5fa0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ent */.){.  asse
5fb0: 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b  rt( interp==0 );
5fc0: 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20     /* This will 
5fd0: 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20  always fail */. 
5fe0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
5ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
6000: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  lowing routine i
6010: 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64  s a user-defined
6020: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68   SQL function wh
6030: 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69  ose purpose.** i
6040: 73 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71  s to test the sq
6050: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28  lite_set_result(
6060: 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  ) API..*/.static
6070: 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73   void testFunc(s
6080: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6090: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
60a0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
60b0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c   **argv){.  whil
60c0: 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  e( argc>=2 ){.  
60d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
60e0: 72 67 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  rg0 = sqlite3_va
60f0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
6100: 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30  );.    if( zArg0
6110: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   ){.      if( 0=
6120: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
6130: 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b  zArg0, "int") ){
6140: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6150: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
6160: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
6170: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29  ue_int(argv[1]))
6180: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6190: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
61a0: 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d  (zArg0,"int64")=
61b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
61c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
61d0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  64(context, sqli
61e0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
61f0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
6200: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
6210: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
6220: 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a  "string")==0 ){.
6230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6240: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6250: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
6260: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
6270: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
6280: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
6290: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
62a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
62b0: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
62c0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
62d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
62e0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
62f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
6300: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
6310: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6320: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6330: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
6340: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6350: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
6360: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
6370: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
6380: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
6390: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
63a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
63b0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
63c0: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
63d0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
63e0: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
63f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
6400: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
6410: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6420: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
6430: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
6440: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
6450: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
6460: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
6470: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
6480: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
6490: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
64a0: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
64b0: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
64c0: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
64d0: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
64e0: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
64f0: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
6500: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
6510: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
6520: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
6530: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
6540: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
6550: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
6560: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
6570: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
6580: 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a  _register_func(.
6590: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
65a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
65b0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
65c0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
65d0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
65e0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
65f0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
6600: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6610: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
6620: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
6630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
6640: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
6650: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
6660: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
6670: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
6680: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
6690: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
66a0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
66b0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
66c0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
66d0: 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d   DB FUNCTION-NAM
66e0: 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
66f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6700: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
6710: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
6720: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
6730: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6740: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
6750: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
6760: 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53  , argv[2], -1, S
6770: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a  QLITE_UTF8, 0, .
6780: 20 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20        testFunc, 
6790: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
67a0: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =0 ){.    Tcl_Ap
67b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
67c0: 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
67d0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
67e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
67f0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
6800: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
6810: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
6820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6830: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
6840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
6850: 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  :  sqlite3_final
6860: 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ize  STMT .**.**
6870: 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74   Finalize a stat
6880: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f  ement handle..*/
6890: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
68a0: 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f 69  _finalize(.  voi
68b0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
68c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
68d0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
68e0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
68f0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
6900: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
6910: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
6920: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
6930: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
6940: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6950: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
6960: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
6970: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
6980: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
6990: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
69a0: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
69b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
69c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
69d0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
69e0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
69f0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
6a00: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
6a10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
6a20: 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62 28    db = StmtToDb(
6a30: 70 53 74 6d 74 29 3b 0a 20 20 72 63 20 3d 20 73  pStmt);.  rc = s
6a40: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6a50: 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
6a60: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
6a70: 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d  (char *)errorNam
6a80: 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
6a90: 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  C);.  if( sqlite
6aa0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
6ab0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
6ac0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6ad0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
6ae0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
6af0: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
6b00: 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69    STMT .**.** Fi
6b10: 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65  nalize a stateme
6b20: 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  nt handle..*/.st
6b30: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65  atic int test_re
6b40: 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  set(.  void * cl
6b50: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
6b60: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
6b70: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
6b80: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
6b90: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
6ba0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
6bb0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
6bc0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
6bd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6be0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
6bf0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
6c00: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
6c10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6c20: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
6c30: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
6c40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6c50: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
6c60: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
6c70: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
6c80: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
6c90: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
6ca0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
6cb0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6cc0: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 73 71  pStmt);.  if( sq
6cd0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
6ce0: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
6cf0: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
6d00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6d10: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
6d20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6d30: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
6d40: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
6d50: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
6d60: 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a  3_changes DB.**.
6d70: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
6d80: 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
6d90: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
6da0: 62 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74  base by the last
6db0: 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f   SQL.** executio
6dc0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
6dd0: 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20   test_changes(. 
6de0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
6df0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
6e00: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
6e10: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
6e20: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
6e30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
6e40: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
6e50: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6e60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
6e70: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
6e80: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
6e90: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
6ea0: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
6eb0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
6ec0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
6ed0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
6ee0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
6ef0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
6f00: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
6f10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
6f20: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
6f30: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
6f40: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61  tObj(sqlite3_cha
6f50: 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65  nges(db)));.  re
6f60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
6f70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
6f80: 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  e "static_bind_v
6f90: 61 6c 75 65 22 20 74 68 61 74 20 76 61 72 69 61  alue" that varia
6fa0: 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74  bles are bound t
6fb0: 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c  o when.** the FL
6fc0: 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c  AG option of sql
6fd0: 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74  ite3_bind is "st
6fe0: 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20  atic".*/.static 
6ff0: 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61  char *sqlite_sta
7000: 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d  tic_bind_value =
7010: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   0;../*.** Usage
7020: 3a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20  :  sqlite3_bind 
7030: 20 56 4d 20 20 49 44 58 20 20 56 41 4c 55 45 20   VM  IDX  VALUE 
7040: 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74   FLAGS.**.** Set
7050: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
7060: 68 65 20 49 44 58 2d 74 68 20 6f 63 63 75 72 61  he IDX-th occura
7070: 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74 68  nce of "?" in th
7080: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a  e original SQL.*
7090: 2a 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55 45  * string.  VALUE
70a0: 20 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75   is the new valu
70b0: 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e  e.  If FLAGS=="n
70c0: 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45 20  ull" then VALUE 
70d0: 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  is.** ignored an
70e0: 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73  d the value is s
70f0: 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20  et to NULL.  If 
7100: 46 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22 20  FLAGS=="static" 
7110: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
7120: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
7130: 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 69  value of a stati
7140: 63 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64  c variable named
7150: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61 74  .** "sqlite_stat
7160: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20  ic_bind_value". 
7170: 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d   If FLAGS=="norm
7180: 61 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79 0a  al" then a copy.
7190: 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45 20  ** of the VALUE 
71a0: 69 73 20 6d 61 64 65 2e 0a 2a 2f 0a 73 74 61 74  is made..*/.stat
71b0: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
71c0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
71d0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
71e0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
71f0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
7200: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7210: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7220: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
7230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7240: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
7250: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
7260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7270: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
7280: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
7290: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
72a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
72b0: 74 20 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67  t idx;.  if( arg
72c0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
72d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
72e0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
72f0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
7300: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
7310: 20 20 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c      " VM IDX VAL
7320: 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c  UE (null|static|
7330: 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a  normal)\"", 0);.
7340: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7350: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
7360: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
7370: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
7380: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
7390: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
73a0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
73b0: 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69  erp, argv[2], &i
73c0: 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
73d0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74  _ERROR;.  if( st
73e0: 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75  rcmp(argv[4],"nu
73f0: 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ll")==0 ){.    r
7400: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
7410: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78  _null(pStmt, idx
7420: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
7430: 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73  trcmp(argv[4],"s
7440: 74 61 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20  tatic")==0 ){.  
7450: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
7460: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
7470: 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74  idx, sqlite_stat
7480: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d  ic_bind_value, -
7490: 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  1, 0);.  }else i
74a0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
74b0: 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29  ],"normal")==0 )
74c0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
74d0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
74e0: 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33 5d  mt, idx, argv[3]
74f0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
7500: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
7510: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7520: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7530: 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
7540: 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
7550: 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
7560: 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
7570: 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
7580: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7590: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
75a0: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
75b0: 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
75c0: 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
75d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
75e0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
75f0: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
7600: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
7610: 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
7620: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
7630: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
7640: 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
7650: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
7660: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
7680: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
7690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
76a0: 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  6./*.** Usage: a
76b0: 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  dd_test_collate 
76c0: 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
76d0: 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
76e0: 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
76f0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
7700: 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
7710: 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
7720: 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f  correct collatio
7730: 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
7740: 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
7750: 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
7760: 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
7770: 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
7780: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
7790: 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
77a0: 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
77b0: 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ers the collatio
77c0: 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74  n sequence "test
77d0: 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74  _collate".** wit
77e0: 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
77f0: 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f  e <db>. The seco
7800: 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  nd argument must
7810: 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68   be a list of th
7820: 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ree.** boolean v
7830: 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69  alues. If the fi
7840: 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  rst is true, the
7850: 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
7860: 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a  est_collate is.*
7870: 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  * registered for
7880: 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73   UTF-8, if the s
7890: 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61  econd is true, a
78a0: 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
78b0: 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54  stered for.** UT
78c0: 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74  F-16le, if the t
78d0: 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
78e0: 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
78f0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
7900: 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
7910: 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ons of test_coll
7920: 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ate are deleted.
7930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
7940: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65  tion sequence te
7950: 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d  st_collate is im
7960: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
7970: 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  ling the.** foll
7980: 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
7990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
79a0: 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c  collate <enc> <l
79b0: 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a  hs> <rhs>".**.**
79c0: 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c   The <lhs> and <
79d0: 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f  rhs> are the two
79e0: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f   values being co
79f0: 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20  mpared, encoded 
7a00: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65  in UTF-8..** The
7a10: 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72   <enc> parameter
7a20: 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   is the encoding
7a30: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
7a40: 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  n function that.
7a50: 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  ** SQLite select
7a60: 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20  ed to call. The 
7a70: 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20  TCL test script 
7a80: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
7a90: 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  * "test_collate"
7aa0: 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   proc..**.** Not
7ab0: 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
7ac0: 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20   only work with 
7ad0: 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20 61  one intepreter a
7ae0: 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65  t a time, as the
7af0: 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74  .** interp point
7b00: 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65  er to use when e
7b10: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43  valuating the TC
7b20: 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72  L script is stor
7b30: 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f  ed in.** pTestCo
7b40: 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a  llateInterp..*/.
7b50: 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72  static Tcl_Inter
7b60: 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  p* pTestCollateI
7b70: 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e  nterp;.static in
7b80: 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  t test_collate_f
7b90: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  unc(.  void *pCt
7ba0: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f  x, .  int nA, co
7bb0: 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
7bc0: 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f  int nB, const vo
7bd0: 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f  id *zB.){.  Tcl_
7be0: 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73  Interp *i = pTes
7bf0: 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
7c00: 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 28 69    int encin = (i
7c10: 6e 74 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72  nt)pCtx;.  int r
7c20: 65 73 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76  es;..  sqlite3_v
7c30: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63  alue *pVal;.  Tc
7c40: 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58  l_Obj *pX;..  pX
7c50: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
7c60: 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74  Obj("test_collat
7c70: 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  e", -1);.  Tcl_I
7c80: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
7c90: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63 69  ..  switch( enci
7ca0: 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  n ){.    case SQ
7cb0: 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20  LITE_UTF8:.     
7cc0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
7cd0: 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
7ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7cf0: 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20  "UTF-8",-1));.  
7d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
7d10: 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
7d20: 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  LE:.      Tcl_Li
7d30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7d40: 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
7d50: 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
7d60: 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  LE",-1));.      
7d70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7d80: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a  SQLITE_UTF16BE:.
7d90: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
7da0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
7db0: 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
7dc0: 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c  gObj("UTF-16BE",
7dd0: 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
7de0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
7df0: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
7e00: 0a 20 20 7d 0a 0a 20 20 70 56 61 6c 20 3d 20 73  .  }..  pVal = s
7e10: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
7e20: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
7e30: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c  SetStr(pVal, nA,
7e40: 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zA, encin, SQLI
7e50: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 54 63  TE_STATIC);.  Tc
7e60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7e70: 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
7e80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
7e90: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7ea0: 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20 20 73 71  pVal),-1));.  sq
7eb0: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
7ec0: 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65  (pVal, nB, zB, e
7ed0: 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  ncin, SQLITE_STA
7ee0: 54 49 43 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  TIC);.  Tcl_List
7ef0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
7f00: 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
7f10: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76  ingObj(sqlite3_v
7f20: 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
7f30: 2d 31 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  -1));.  sqlite3V
7f40: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
7f50: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
7f60: 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  (i, pX, 0);.  Tc
7f70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
7f80: 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74  X);.  Tcl_GetInt
7f90: 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47  FromObj(i, Tcl_G
7fa0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20  etObjResult(i), 
7fb0: 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  &res);.  return 
7fc0: 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  res;.}.static in
7fd0: 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a  t test_collate(.
7fe0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
7ff0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
8000: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
8010: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
8020: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
8030: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
8040: 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71  .  int val;.  sq
8050: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
8060: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
8070: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
8080: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70  to bad_args;.  p
8090: 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
80a0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66  p = interp;.  if
80b0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
80c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
80d0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
80e0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
80f0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
8100: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
8110: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
8120: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
8130: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
8140: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
8150: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
8160: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  llation(db, "tes
8170: 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49  t_collate", SQLI
8180: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
8190: 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
81a0: 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73  TE_UTF8, val?tes
81b0: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
81c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
81d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
81e0: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
81f0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
8200: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
8210: 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
8220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  TCL_ERROR;.    r
8230: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
8240: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
8250: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
8260: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
8270: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76   .            (v
8280: 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
8290: 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63  16LE, val?test_c
82a0: 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
82b0: 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
82c0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
82d0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
82e0: 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[4], &val) ) r
82f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8300: 0a 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ..    pVal = sql
8310: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
8320: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
8330: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
8340: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
8350: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
8360: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
8370: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
8380: 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c  _collation16(db,
8390: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
83a0: 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
83b0: 54 46 31 36 4e 41 54 49 56 45 29 2c 20 0a 20 20  TF16NATIVE), .  
83c0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
83d0: 54 46 31 36 42 45 2c 20 28 76 6f 69 64 20 2a 29  TF16BE, (void *)
83e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
83f0: 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
8400: 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 73 71  _func:0);.    sq
8410: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
8420: 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Val);.  }.  if( 
8430: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8440: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8450: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
8460: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
8470: 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
8480: 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
8490: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
84a0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
84b0: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
84c0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
84d0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
84e0: 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
84f0: 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
8500: 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65  16be>", 0);.  re
8510: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8520: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
8530: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
8540: 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70  ed_cb(.  void *p
8550: 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  Ctx, .  sqlite3 
8560: 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  *db,.  int eText
8570: 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Rep,.  const voi
8580: 64 20 2a 6e 6f 74 55 73 65 64 0a 29 7b 0a 20 20  d *notUsed.){.  
8590: 69 6e 74 20 65 6e 63 20 3d 20 64 62 2d 3e 65 6e  int enc = db->en
85a0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  c;.  sqlite3_cre
85b0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
85c0: 20 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63       db, "test_c
85d0: 6f 6c 6c 61 74 65 22 2c 20 64 62 2d 3e 65 6e 63  ollate", db->enc
85e0: 2c 20 28 76 6f 69 64 20 2a 29 65 6e 63 2c 20 74  , (void *)enc, t
85f0: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
8600: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
8610: 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
8620: 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f  ate_needed DB.*/
8630: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
8640: 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28  _collate_needed(
8650: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
8660: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
8670: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
8680: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
8690: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
86a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
86b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
86c0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74  f( objc!=2 ) got
86d0: 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
86e0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
86f0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
8700: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
8710: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
8720: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
8730: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
8740: 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c  _needed16(db, 0,
8750: 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
8760: 65 64 65 64 5f 63 62 29 3b 0a 20 20 69 66 28 20  eded_cb);.  if( 
8770: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8780: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8790: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
87a0: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
87b0: 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
87c0: 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  s:.  Tcl_WrongNu
87d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
87e0: 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
87f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8800: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8810: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
8820: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  */../*.** Usage:
8830: 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69   add_test_functi
8840: 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66  on <db ptr> <utf
8850: 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
8860: 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69  f16be>.**.** Thi
8870: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
8880: 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  ed to test that 
8890: 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74  SQLite selects t
88a0: 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a  he correct user.
88b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ** function call
88c0: 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
88d0: 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
88e0: 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
88f0: 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
8900: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
8910: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
8920: 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
8930: 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65  s up to three ve
8940: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73  rsions of the us
8950: 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  er function.** "
8960: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77  test_function" w
8970: 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e  ith database han
8980: 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68  dle <db>.  If th
8990: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
89a0: 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  t is.** true, th
89b0: 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  en a version of 
89c0: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73  test_function is
89d0: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
89e0: 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a  UTF-8, if the.**
89f0: 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20   third is true, 
8a00: 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67  a version is reg
8a10: 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
8a20: 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75  16le, if the fou
8a30: 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20  rth is.** true, 
8a40: 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69  a UTF-16be versi
8a50: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
8a60: 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69    Previous versi
8a70: 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66  ons of.** test_f
8a80: 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65  unction are dele
8a90: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75  ted..**.** The u
8aa0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ser function is 
8ab0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
8ac0: 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  alling the follo
8ad0: 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a  wing TCL script:
8ae0: 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66  .**.**   "test_f
8af0: 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61  unction <enc> <a
8b00: 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  rg>".**.** Where
8b10: 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66   <enc> is one of
8b20: 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45   UTF-8, UTF-16LE
8b30: 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64   or UTF16BE, and
8b40: 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a   <arg> is the.**
8b50: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
8b60: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53   passed to the S
8b70: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  QL function. The
8b80: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
8b90: 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63  by.** the TCL sc
8ba0: 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20  ript is used as 
8bb0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
8bc0: 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63   of the SQL func
8bd0: 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70  tion. It.** is p
8be0: 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20  assed to SQLite 
8bf0: 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66  using UTF-16BE f
8c00: 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f  or a UTF-8 test_
8c10: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d  function(), UTF-
8c20: 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31  8.** for a UTF-1
8c30: 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  6LE test_functio
8c40: 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c  n(), and UTF-16L
8c50: 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65  E for an impleme
8c60: 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
8c70: 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45  prefers UTF-16BE
8c80: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
8c90: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73  ITE_OMIT_UTF16.s
8ca0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
8cb0: 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20  function_utf8(. 
8cc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8cd0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
8ce0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
8cf0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8d00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8d10: 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
8d20: 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
8d30: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
8d40: 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
8d50: 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
8d60: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
8d70: 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
8d80: 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
8d90: 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
8da0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
8db0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
8dc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8dd0: 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
8de0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
8df0: 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  8", -1));.  Tcl_
8e00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8e10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
8e20: 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
8e30: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
8e40: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8e50: 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
8e60: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
8e70: 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
8e80: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
8e90: 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  X);.  sqlite3_re
8ea0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
8eb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
8ec0: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c  ult(interp), -1,
8ed0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
8ee0: 54 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  T);.  pVal = sql
8ef0: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
8f00: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
8f10: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
8f20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
8f30: 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
8f40: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
8f50: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
8f60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8f70: 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
8f80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8f90: 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
8fa0: 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
8fb0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
8fc0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
8fd0: 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
8fe0: 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
8ff0: 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
9000: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
9010: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
9020: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
9030: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
9040: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
9050: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
9060: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9070: 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
9080: 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
9090: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
90a0: 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
90b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
90c0: 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
90d0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
90e0: 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
90f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
9100: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
9110: 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
9120: 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
9130: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
9140: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
9150: 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
9160: 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
9170: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76  ingObj(sqlite3_v
9180: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9190: 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
91a0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
91b0: 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
91c0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
91d0: 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
91e0: 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20  e3ValueNew();.  
91f0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
9200: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
9210: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
9220: 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
9230: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
9240: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
9250: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
9260: 65 78 74 28 70 43 74 78 2c 73 71 6c 69 74 65 33  ext(pCtx,sqlite3
9270: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
9280: 29 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e  ),-1,SQLITE_TRAN
9290: 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
92a0: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
92b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
92c0: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
92d0: 66 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33  f16be(.  sqlite3
92e0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
92f0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
9300: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
9310: 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
9320: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
9330: 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
9340: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
9350: 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
9360: 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
9370: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
9380: 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
9390: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
93a0: 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
93b0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
93c0: 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
93d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
93e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
93f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
9400: 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d  bj("UTF-16BE", -
9410: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
9420: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
9430: 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
9440: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
9450: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
9460: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
9470: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
9480: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
9490: 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
94a0: 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
94b0: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
94c0: 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c  alueNew();.  sql
94d0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
94e0: 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
94f0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
9500: 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
9510: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
9520: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
9530: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
9540: 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16le(pCtx, sqlit
9550: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
9560: 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
9570: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
9580: 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
9590: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
95a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
95b0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
95c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
95d0: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
95e0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
95f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9600: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
9610: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
9620: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
9630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9640: 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
9650: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b   *db;.  int val;
9660: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
9670: 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
9680: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
9690: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
96a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
96b0: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
96c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
96d0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
96e0: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
96f0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
9700: 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
9710: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
9720: 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
9730: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
9740: 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
9750: 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
9760: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
9770: 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
9780: 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20  _function_utf8, 
9790: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
97a0: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
97b0: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
97c0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
97d0: 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
97e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
97f0: 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
9800: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
9810: 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
9820: 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
9830: 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
9840: 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
9850: 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c  _function_utf16l
9860: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e, 0, 0);.  }.  
9870: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
9880: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
9890: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
98a0: 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
98b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
98c0: 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
98d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
98e0: 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
98f0: 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
9900: 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
9910: 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
9920: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
9930: 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  16be, 0, 0);.  }
9940: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
9950: 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  K;.bad_args:.  T
9960: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9970: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9980: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9990: 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
99a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
99b0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
99c0: 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
99d0: 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
99e0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
99f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
9a00: 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
9a10: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
9a20: 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  * Usage:        
9a30: 20 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72   test_errstr <er
9a40: 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65  r code>.**.** Te
9a50: 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c  st that the engl
9a60: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72  ish language str
9a70: 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20  ing equivalents 
9a80: 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72  for sqlite error
9a90: 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61   codes.** are sa
9aa0: 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  ne. The paramete
9ab0: 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  r is an integer 
9ac0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
9ad0: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
9ae0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
9af0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77   is a list of tw
9b00: 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20  o elements, the 
9b10: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
9b20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
9b30: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74  error code and t
9b40: 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he english langu
9b50: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e  age explanation.
9b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
9b70: 65 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f  est_errstr(.  vo
9b80: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
9b90: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9ba0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
9bb0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
9bc0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
9bd0: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69  char *zCode;.  i
9be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63  nt i;.  if( objc
9bf0: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
9c00: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
9c10: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65  rp, 1, objv, "<e
9c20: 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20  rror code>");.  
9c30: 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c  }..  zCode = Tcl
9c40: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
9c50: 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1]);.  for(i=0; 
9c60: 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<200; i++){.   
9c70: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 65   if( 0==strcmp(e
9c80: 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f  rrorName(i), zCo
9c90: 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  de) ) break;.  }
9ca0: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
9cb0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
9cc0: 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  )sqlite3ErrStr(i
9cd0: 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
9ce0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
9cf0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  c int sqlite3_cr
9d00: 61 73 68 70 61 72 61 6d 73 28 0a 20 20 76 6f 69  ashparams(.  voi
9d10: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
9d20: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9d30: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
9d40: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
9d50: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
9d60: 64 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 69 6e  def OS_TEST.  in
9d70: 74 20 64 65 6c 61 79 3b 0a 20 20 69 66 28 20 6f  t delay;.  if( o
9d80: 62 6a 63 21 3d 33 20 29 20 67 6f 74 6f 20 62 61  bjc!=3 ) goto ba
9d90: 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 54 63  d_args;.  if( Tc
9da0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
9db0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
9dc0: 20 26 64 65 6c 61 79 29 20 29 20 72 65 74 75 72   &delay) ) retur
9dd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
9de0: 71 6c 69 74 65 33 53 65 74 43 72 61 73 68 50 61  qlite3SetCrashPa
9df0: 72 61 6d 73 28 64 65 6c 61 79 2c 20 54 63 6c 5f  rams(delay, Tcl_
9e00: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
9e10: 5d 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ]));.#endif.  re
9e20: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 23 69  turn TCL_OK;..#i
9e30: 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 62 61 64  fdef OS_TEST.bad
9e40: 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70  _args:.  Tcl_App
9e50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9e60: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
9e70: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
9e80: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
9e90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
9ea0: 30 5d 2c 20 30 29 2c 20 22 3c 64 65 6c 61 79 3e  0], 0), "<delay>
9eb0: 20 3c 66 69 6c 65 6e 61 6d 65 3e 22 2c 20 30 29   <filename>", 0)
9ec0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
9ed0: 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  RROR;.#endif.}..
9ee0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
9ef0: 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
9f00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
9f10: 78 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75  xists for one pu
9f20: 72 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69  rpose - to provi
9f30: 64 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75  de a place to pu
9f40: 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e  t a.** breakpoin
9f50: 74 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20  t with GDB that 
9f60: 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64  can be triggered
9f70: 20 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e   using TCL code.
9f80: 20 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72    The use.** for
9f90: 20 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20   this is when a 
9fa0: 70 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20  particular test 
9fb0: 66 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74  fails on (say) t
9fc0: 68 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74  he 1485th iterat
9fd0: 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54  ion..** In the T
9fe0: 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20  CL test script, 
9ff0: 77 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20  we can add code 
a000: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
a010: 20 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38       if {$i==148
a020: 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a  5} breakpoint.**
a030: 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73  .** Then run tes
a040: 74 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20  tfixture in the 
a050: 64 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69  debugger and wai
a060: 74 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70  t for the breakp
a070: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e  oint to.** fire.
a080: 20 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61    Then additiona
a090: 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61  l breakpoints ca
a0a0: 6e 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63  n be set to trac
a0b0: 65 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a  e down the bug..
a0c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
a0d0: 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20  st_breakpoint(. 
a0e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a0f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a100: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a110: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a120: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a130: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a140: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a160: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a170: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a180: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a190: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a1a0: 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
a1b0: 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20   TCL_OK;        
a1c0: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
a1d0: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  /.}../*.** Usage
a1e0: 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
a1f0: 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56 41 4c  _int  STMT N VAL
a200: 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  UE.**.** Test th
a210: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  e sqlite3_bind_i
a220: 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  nt interface.  S
a230: 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
a240: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
a250: 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
a260: 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
a270: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
a280: 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
a290: 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
a2a0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
a2b0: 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
a2c0: 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
a2d0: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
a2e0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  int(.  void * cl
a2f0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
a300: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
a310: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
a320: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
a330: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
a340: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
a350: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 76  int idx;.  int v
a360: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
a370: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
a380: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
a390: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a3a0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
a3b0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
a3c0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
a3d0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
a3e0: 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
a3f0: 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
a400: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a410: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
a420: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
a430: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
a440: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
a450: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
a460: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
a470: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
a480: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
a490: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
a4a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
a4b0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
a4c0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
a4d0: 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65  3], &value) ) re
a4e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a4f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
a500: 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
a510: 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
a520: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
a530: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
a540: 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
a550: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
a560: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
a570: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a580: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a590: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
a5a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
a5b0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
a5c0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20  ite3_bind_int64 
a5d0: 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a   STMT N VALUE.**
a5e0: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
a5f0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20  ite3_bind_int64 
a600: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
a610: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
a620: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
a630: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
a640: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
a650: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
a660: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
a670: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34  nd.** binds a 64
a680: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
a690: 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
a6a0: 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
a6b0: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74  nt test_bind_int
a6c0: 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  64(.  void * cli
a6d0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
a6e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
a6f0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
a700: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a710: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
a720: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
a730: 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20 76 61  nt idx;.  i64 va
a740: 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
a750: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
a760: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a770: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a780: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a790: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
a7a0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
a7b0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
a7c0: 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
a7d0: 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
a7e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a7f0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
a800: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
a810: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
a820: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
a830: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
a840: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
a850: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
a860: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
a870: 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
a880: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
a890: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
a8a0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
a8b0: 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
a8c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a8d0: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
a8e0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
a8f0: 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
a900: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
a910: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
a920: 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
a930: 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
a940: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
a950: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a960: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
a970: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
a980: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a990: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
a9a0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
a9b0: 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56 41  ouble  STMT N VA
a9c0: 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
a9d0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
a9e0: 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63 65  double interface
a9f0: 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
aa00: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
aa10: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
aa20: 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
aa30: 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
aa40: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
aa50: 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
aa60: 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
aa70: 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
aa80: 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
aa90: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
aaa0: 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  ind_double(.  vo
aab0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
aac0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
aad0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
aae0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
aaf0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ab00: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
ab10: 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
ab20: 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
ab30: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
ab40: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
ab50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ab60: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
ab70: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
ab80: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
ab90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
aba0: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
abb0: 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22   " STMT N VALUE"
abc0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
abd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
abe0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
abf0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
ac00: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
ac10: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
ac20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ac30: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
ac40: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
ac50: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
ac60: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ac70: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
ac80: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
ac90: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
aca0: 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
acb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
acc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
acd0: 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
ace0: 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
acf0: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
ad00: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
ad10: 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
ad20: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
ad30: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
ad40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ad50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ad60: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
ad70: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
ad80: 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
ad90: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53  te3_bind_null  S
ada0: 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  TMT N.**.** Test
adb0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
adc0: 64 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65  d_null interface
add0: 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
ade0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
adf0: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
ae00: 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
ae10: 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
ae20: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
ae30: 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
ae40: 64 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65  ds a NULL to the
ae50: 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
ae60: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
ae70: 6e 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20  nd_null(.  void 
ae80: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
ae90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
aea0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
aeb0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
aec0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
aed0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
aee0: 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
aef0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
af00: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
af10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
af20: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
af30: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
af40: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
af50: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
af60: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
af70: 53 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20  STMT N", 0);.   
af80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
af90: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
afa0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
afb0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
afc0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
afd0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
afe0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
aff0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
b000: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
b010: 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
b020: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
b030: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
b040: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78  _null(pStmt, idx
b050: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
b060: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
b070: 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
b080: 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
b090: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
b0a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b0b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
b0c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b0d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
b0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
b0f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
b100: 65 78 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49  ext  STMT N STRI
b110: 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54  NG BYTES.**.** T
b120: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
b130: 62 69 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66  bind_text interf
b140: 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
b150: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
b160: 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
b170: 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
b180: 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
b190: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
b1a0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
b1b0: 62 69 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74  binds a UTF-8 st
b1c0: 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74  ring STRING to t
b1d0: 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
b1e0: 65 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45  e string is BYTE
b1f0: 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e  S bytes.** long.
b200: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b210: 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20  est_bind_text(. 
b220: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
b230: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
b240: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
b250: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
b260: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
b270: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
b280: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
b290: 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
b2a0: 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
b2b0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
b2c0: 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
b2d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b2e0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
b2f0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
b300: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
b310: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
b320: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
b330: 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42  " STMT N VALUE B
b340: 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72  YTES", 0);.    r
b350: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b360: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
b370: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
b380: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b390: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
b3a0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
b3b0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
b3c0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
b3d0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
b3e0: 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
b3f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75  CL_ERROR;.  valu
b400: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
b410: 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66  g(objv[3]);.  if
b420: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
b430: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
b440: 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [4], &bytes) ) r
b450: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b460: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
b470: 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
b480: 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79  , idx, value, by
b490: 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  tes, SQLITE_TRAN
b4a0: 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71  SIENT);.  if( sq
b4b0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
b4c0: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
b4d0: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
b4e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b4f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b500: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
b510: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b520: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
b530: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
b540: 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
b550: 69 6e 64 5f 74 65 78 74 31 36 20 20 53 54 4d 54  ind_text16  STMT
b560: 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
b570: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
b580: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
b590: 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  16 interface.  S
b5a0: 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
b5b0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
b5c0: 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
b5d0: 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
b5e0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
b5f0: 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
b600: 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
b610: 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53   UTF-16 string S
b620: 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c  TRING to the wil
b630: 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69  dcard.  The stri
b640: 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65  ng is BYTES byte
b650: 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  s.** long..*/.st
b660: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
b670: 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69  nd_text16(.  voi
b680: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
b690: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b6a0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
b6b0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
b6c0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
b6d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b6e0: 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
b6f0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
b700: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
b710: 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
b720: 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
b730: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
b740: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b750: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
b760: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
b770: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
b780: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
b790: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
b7a0: 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
b7b0: 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b  ALUE BYTES", 0);
b7c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b7d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
b7e0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
b7f0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b800: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b810: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
b820: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
b830: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
b840: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
b850: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
b860: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b870: 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65    value = Tcl_Ge
b880: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
b890: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
b8a0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
b8b0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
b8c0: 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20  bjv[4], &bytes) 
b8d0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b8e0: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
b8f0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  te3_bind_text16(
b900: 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69  pStmt, idx, (voi
b910: 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73  d *)value, bytes
b920: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
b930: 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  NT);.  if( sqlit
b940: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
b950: 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
b960: 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
b970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b980: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b990: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
b9a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b9b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b9c0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
b9d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
b9f0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ba00: 62 6c 6f 62 20 20 53 54 4d 54 20 4e 20 44 41 54  blob  STMT N DAT
ba10: 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  A BYTES.**.** Te
ba20: 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
ba30: 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61  ind_blob interfa
ba40: 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
ba50: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ba60: 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
ba70: 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
ba80: 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
ba90: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
baa0: 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
bab0: 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74  inds a BLOB to t
bac0: 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
bad0: 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20  e BLOB is BYTES 
bae0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
baf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
bb00: 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76  t_bind_blob(.  v
bb10: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
bb20: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
bb30: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
bb40: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
bb50: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
bb60: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
bb70: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
bb80: 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
bb90: 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
bba0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
bbb0: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
bbc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bbd0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
bbe0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
bbf0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
bc00: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
bc10: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
bc20: 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
bc30: 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
bc40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bc50: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
bc60: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
bc70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
bc80: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
bc90: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
bca0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
bcb0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
bcc0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
bcd0: 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
bce0: 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
bcf0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
bd00: 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[3]);.  if( T
bd10: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
bd20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
bd30: 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
bd40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
bd50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
bd60: 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  nd_blob(pStmt, i
bd70: 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73  dx, value, bytes
bd80: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
bd90: 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  NT);.  if( sqlit
bda0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
bdb0: 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
bdc0: 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
bdd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bde0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bdf0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
be00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
be10: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
be20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
be30: 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
be40: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
be50: 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
be60: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
be70: 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
be80: 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65  he given stateme
be90: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
bea0: 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
beb0: 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76  meter_count(.  v
bec0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
bed0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
bee0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
bef0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
bf00: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
bf10: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
bf20: 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
bf30: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
bf40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
bf50: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
bf60: 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
bf70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
bf80: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
bf90: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
bfa0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
bfb0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
bfc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bfd0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
bfe0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
bff0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
c000: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
c010: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  r_count(pStmt)))
c020: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
c030: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
c040: 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
c050: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
c060: 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20    STMT  N.**.** 
c070: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
c080: 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63  of the Nth wildc
c090: 61 72 64 2e 20 20 54 68 65 20 66 69 72 73 74 20  ard.  The first 
c0a0: 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a  wildcard is 1..*
c0b0: 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  * An empty strin
c0c0: 67 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  g is returned if
c0d0: 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
c0e0: 67 65 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c  ge or if the wil
c0f0: 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65  dcard.** is name
c100: 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
c110: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
c120: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20  rameter_name(.  
c130: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
c140: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
c150: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
c160: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
c170: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
c180: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
c190: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pStmt;.  int i;.
c1a0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
c1b0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
c1c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
c1d0: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22  , objv, "STMT N"
c1e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c1f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
c200: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
c210: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
c220: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
c230: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
c240: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c250: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
c260: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
c270: 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74  jv[2], &i) ) ret
c280: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c290: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
c2a0: 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
c2b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c2c0: 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
c2d0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
c2e0: 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20  mt,i),-1).  );. 
c2f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
c300: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
c310: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
c320: 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20  arameter_index  
c330: 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  STMT  NAME.**.**
c340: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
c350: 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  x of the wildcar
c360: 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  d called NAME.  
c370: 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
c380: 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  e is.** no such 
c390: 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
c3a0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
c3b0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
c3c0: 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  x(.  void * clie
c3d0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
c3e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
c3f0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
c400: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c410: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
c420: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
c430: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
c440: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c450: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c460: 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29  jv, "STMT NAME")
c470: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c480: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
c490: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
c4a0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
c4b0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
c4c0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
c4d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
c4e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
c4f0: 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
c500: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20  l_NewIntObj(.   
c510: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
c520: 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
c530: 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74  (pStmt,Tcl_GetSt
c540: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20  ring(objv[2])). 
c550: 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74      ).  );.  ret
c560: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
c570: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
c580: 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a  te3_errcode DB.*
c590: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c5a0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
c5b0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
c5c0: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
c5d0: 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20  _* API.** error 
c5e0: 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49  code. e.g. "SQLI
c5f0: 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74  TE_ERROR"..*/.st
c600: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
c610: 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
c620: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
c630: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c640: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
c650: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
c660: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
c670: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f  e3 *db;..  if( o
c680: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
c690: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c6a0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
c6b0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
c6c0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
c6d0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c6e0: 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
c6f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c700: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
c710: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
c720: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
c730: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
c740: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
c750: 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52  RROR;.  Tcl_SetR
c760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c770: 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28  har *)errorName(
c780: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
c790: 64 62 29 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  db)), 0);.  retu
c7a0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
c7b0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73  .** Usage:   tes
c7c0: 74 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a  t_errmsg DB.**.*
c7d0: 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
c7e0: 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69  F-8 representati
c7f0: 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  on of the error 
c800: 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66  message string f
c810: 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  or the.** most r
c820: 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
c830: 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  API call..*/.sta
c840: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
c850: 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  msg(.  void * cl
c860: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
c870: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
c880: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
c890: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c8a0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
c8b0: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
c8c0: 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28  ar *zErr;..  if(
c8d0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
c8e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c8f0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
c900: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
c910: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
c920: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
c930: 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
c940: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c950: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
c960: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
c970: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
c980: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
c990: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
c9a0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
c9b0: 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
c9c0: 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
c9d0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
c9e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
c9f0: 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20  j(zErr, -1));.  
ca00: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ca10: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
ca20: 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44   test_errmsg16 D
ca30: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
ca40: 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65  the UTF-16 repre
ca50: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
ca60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
ca70: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
ca80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
ca90: 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
caa0: 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20   This is a byte 
cab0: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20  array object at 
cac0: 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65  the TCL .** leve
cad0: 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64  l, and it includ
cae0: 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30  es the 0x00 0x00
caf0: 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
cb00: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
cb10: 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  the.** UTF-16 st
cb20: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
cb30: 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31  int test_errmsg1
cb40: 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
cb50: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
cb60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
cb70: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
cb80: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
cb90: 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
cba0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
cbb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
cbc0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72  const void *zErr
cbd0: 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 0a  ;.  int bytes;..
cbe0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
cbf0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
cc00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
cc10: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
cc20: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
cc30: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
cc40: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
cc50: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
cc60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cc70: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
cc80: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
cc90: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
cca0: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
ccb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
ccc0: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
ccd0: 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 62  rrmsg16(db);.  b
cce0: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 75 74  ytes = sqlite3ut
ccf0: 66 31 36 42 79 74 65 4c 65 6e 28 7a 45 72 72 2c  f16ByteLen(zErr,
cd00: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   -1);.  Tcl_SetO
cd10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
cd20: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
cd30: 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73  yObj(zErr, bytes
cd40: 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ));.#endif /* SQ
cd50: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
cd60: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
cd70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
cd80: 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
cd90: 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73  are DB sql bytes
cda0: 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
cdb0: 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
cdc0: 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
cdd0: 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
cde0: 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
cdf0: 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
ce00: 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
ce10: 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
ce20: 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
ce30: 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
ce40: 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
ce50: 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
ce60: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
ce70: 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
ce80: 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
ce90: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
cea0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
ceb0: 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  pare(.  void * c
cec0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
ced0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
cee0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
cef0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
cf00: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
cf10: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
cf20: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
cf30: 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20   bytes;.  const 
cf40: 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  char *zTail = 0;
cf50: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
cf60: 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
cf70: 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
cf80: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
cf90: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
cfa0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
cfb0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
cfc0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
cfd0: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
cfe0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
cff0: 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
d000: 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b  es tailvar", 0);
d010: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d020: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
d030: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
d040: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
d050: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
d060: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
d070: 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
d080: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d090: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
d0a0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
d0b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
d0c0: 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
d0d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
d0e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
d0f0: 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62  pare(db, zSql, b
d100: 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a  ytes, &pStmt, &z
d110: 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  Tail);.  if( sql
d120: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
d130: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
d140: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d150: 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20  OR;.  if( zTail 
d160: 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73  ){.    if( bytes
d170: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74  >=0 ){.      byt
d180: 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54  es = bytes - (zT
d190: 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ail-zSql);.    }
d1a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
d1b0: 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
d1c0: 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53  [4], 0, Tcl_NewS
d1d0: 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20  tringObj(zTail, 
d1e0: 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a  bytes), 0);.  }.
d1f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d200: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
d210: 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t( pStmt==0 );. 
d220: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
d230: 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
d240: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d250: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
d260: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
d270: 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
d280: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d290: 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
d2a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 6b 65   ){.    if( make
d2b0: 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
d2c0: 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
d2d0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d2e0: 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OR;.    Tcl_Appe
d2f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d300: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   zBuf, 0);.  }. 
d310: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
d320: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
d330: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
d340: 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
d350: 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  lvar.**.** Compi
d360: 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
d370: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
d380: 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
d390: 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
d3a0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
d3b0: 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
d3c0: 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
d3d0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
d3e0: 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
d3f0: 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
d400: 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
d410: 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
d420: 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
d430: 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
d440: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
d450: 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
d460: 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
d470: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d480: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d490: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d4a0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d4b0: 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
d4c0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
d4d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
d4e0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
d4f0: 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
d500: 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
d510: 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
d520: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
d530: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
d540: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20  har zBuf[50]; . 
d550: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
d560: 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ytes;           
d570: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
d580: 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73  ger specified as
d590: 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20   arg 3 */.  int 
d5a0: 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  objlen;         
d5b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
d5c0: 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f  e-array length o
d5d0: 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66  f arg 2 */..  if
d5e0: 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
d5f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d600: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
d610: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
d620: 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
d630: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d640: 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
d650: 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
d660: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d670: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d680: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
d690: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
d6a0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d6b0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
d6c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
d6d0: 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  l = Tcl_GetByteA
d6e0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
d6f0: 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20  [2], &objlen);. 
d700: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
d710: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
d720: 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
d730: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d740: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
d750: 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64 62  te3_prepare16(db
d760: 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
d770: 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a  pStmt, &zTail);.
d780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
d790: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
d7a0: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
d7b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
d7c0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
d7d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d7e0: 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69 6c 20   }..  if( zTail 
d7f0: 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  ){.    objlen = 
d800: 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29  objlen - ((u8 *)
d810: 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c  zTail-(u8 *)zSql
d820: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d830: 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  objlen = 0;.  }.
d840: 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65    pTail = Tcl_Ne
d850: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
d860: 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65  8 *)zTail, objle
d870: 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  n);.  Tcl_IncrRe
d880: 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
d890: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
d8a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
d8b0: 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
d8c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
d8d0: 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69 66 28  t(pTail);..  if(
d8e0: 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
d8f0: 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  ( makePointerStr
d900: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
d910: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
d920: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d930: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d940: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
d950: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
d960: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
d970: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
d980: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
d990: 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20  e: sqlite3_open 
d9a0: 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e  filename ?option
d9b0: 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69  s-list?.*/.stati
d9c0: 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28  c int test_open(
d9d0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
d9e0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
d9f0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
da00: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
da10: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
da20: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
da30: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
da40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
da50: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
da60: 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
da70: 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
da80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
da90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
daa0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
dab0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
dac0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
dad0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
dae0: 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
daf0: 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
db00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
db10: 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
db20: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
db30: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
db40: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
db50: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  n(zFilename, &db
db60: 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d 61 6b 65  );.  .  if( make
db70: 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
db80: 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
db90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dba0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
dbb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
dbc0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
dbd0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
dbe0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
dbf0: 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f  pen16 filename o
dc00: 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  ptions.*/.static
dc10: 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36   int test_open16
dc20: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
dc30: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
dc40: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
dc50: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
dc60: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
dc70: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
dc80: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
dc90: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
dca0: 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
dcb0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
dcc0: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
dcd0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
dce0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
dcf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dd00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
dd10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
dd20: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
dd30: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
dd40: 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
dd50: 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
dd60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
dd70: 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
dd80: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ame = Tcl_GetByt
dd90: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
dda0: 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63 20  jv[1], 0);.  rc 
ddb0: 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  = sqlite3_open16
ddc0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29  (zFilename, &db)
ddd0: 3b 0a 20 20 0a 20 20 69 66 28 20 6d 61 6b 65 50  ;.  .  if( makeP
dde0: 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
ddf0: 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65  , zBuf, db) ) re
de00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
de10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
de20: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
de30: 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
de40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
de50: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
de60: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
de70: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d  age: sqlite3_com
de80: 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20  plete16 <UTF-16 
de90: 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65  string>.**.** Re
dea0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 73 75  turn 1 if the su
deb0: 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20  pplied argument 
dec0: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
ded0: 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20  L statement, or 
dee0: 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
def0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
df00: 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36   test_complete16
df10: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
df20: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
df30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
df40: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
df50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
df60: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
df70: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
df80: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69  char *zBuf;..  i
df90: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
dfa0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
dfb0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
dfc0: 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c  jv, "<utf-16 sql
dfd0: 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >");.    return 
dfe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
dff0: 20 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47 65 74    zBuf = Tcl_Get
e000: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
e010: 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
e020: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e030: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
e040: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
e050: 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29  omplete16(zBuf))
e060: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
e070: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
e080: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
e090: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
e0a0: 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  e: sqlite3_step 
e0b0: 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e  STMT.**.** Advan
e0c0: 63 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ce the statement
e0d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
e0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e0f0: 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69  test_step(.  voi
e100: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
e110: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e120: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
e130: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
e140: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
e150: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
e160: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
e170: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
e180: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e190: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
e1a0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
e1b0: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
e1c0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
e1d0: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
e1e0: 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
e1f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e200: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
e210: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
e220: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
e230: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
e240: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e250: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
e260: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
e270: 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51  .  /* if( rc!=SQ
e280: 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21  LITE_DONE && rc!
e290: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65  =SQLITE_ROW ) re
e2a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20  turn TCL_ERROR; 
e2b0: 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  */.  Tcl_SetResu
e2c0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
e2d0: 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29   *)errorName(rc)
e2e0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
e2f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
e300: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
e310: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54  olumn_count STMT
e320: 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
e330: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e340: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
e350: 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
e360: 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
e370: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
e380: 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  mn_count(.  void
e390: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
e3a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e3b0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
e3c0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
e3d0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
e3e0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
e3f0: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
e400: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
e410: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e420: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
e430: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
e440: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
e450: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
e460: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
e470: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e480: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
e490: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
e4a0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
e4b0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
e4c0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
e4d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e4e0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
e4f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
e500: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
e510: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
e520: 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
e530: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
e540: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
e550: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54  3_column_type ST
e560: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
e570: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
e580: 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  of the data in c
e590: 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
e5a0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
e5b0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
e5c0: 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
e5d0: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
e5e0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
e5f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
e600: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
e610: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e620: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
e630: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
e640: 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b  t col;.  int tp;
e650: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
e660: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
e670: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e680: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
e690: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
e6a0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
e6b0: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
e6c0: 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
e6d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e6e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
e6f0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
e700: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
e710: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
e720: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
e730: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e740: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
e750: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
e760: 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
e770: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e780: 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33  ..  tp = sqlite3
e790: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
e7a0: 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74  mt, col);.  swit
e7b0: 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61  ch( tp ){.    ca
e7c0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
e7d0: 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  R: .      Tcl_Se
e7e0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
e7f0: 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53  "INTEGER", TCL_S
e800: 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
e810: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
e820: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20  QLITE_NULL:.    
e830: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
e840: 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20  interp, "NULL", 
e850: 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
e860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
e870: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
e880: 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
e890: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46  esult(interp, "F
e8a0: 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49  LOAT", TCL_STATI
e8b0: 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
e8c0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
e8d0: 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63  E_TEXT:.      Tc
e8e0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
e8f0: 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f  rp, "TEXT", TCL_
e900: 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
e910: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
e920: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20  SQLITE_BLOB:.   
e930: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
e940: 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c  (interp, "BLOB",
e950: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
e960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e970: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
e980: 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20  ssert(0);.  }.. 
e990: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
e9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
e9b0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
e9c0: 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  nt64 STMT column
e9d0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
e9e0: 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
e9f0: 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
ea00: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
ea10: 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20  t as an.** wide 
ea20: 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72  (64-bit) integer
ea30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ea40: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
ea50: 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  4(.  void * clie
ea60: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ea70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ea80: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ea90: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
eaa0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
eab0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
eac0: 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61  t col;.  i64 iVa
ead0: 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
eae0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
eaf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
eb00: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
eb10: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
eb20: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
eb30: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
eb40: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
eb50: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
eb60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
eb70: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
eb80: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
eb90: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
eba0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
ebb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ebc0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
ebd0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ebe0: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
ebf0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ec00: 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c  R;..  iVal = sql
ec10: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
ec20: 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  4(pStmt, col);. 
ec30: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
ec40: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
ec50: 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c  wWideIntObj(iVal
ec60: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
ec70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
ec80: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
ec90: 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f  umn_blob STMT co
eca0: 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
ecb0: 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62  nt test_column_b
ecc0: 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
ecd0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
ece0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
ecf0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
ed00: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
ed10: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
ed20: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
ed30: 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20  int col;..  int 
ed40: 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  len;.  const voi
ed50: 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28  d *pBlob;..  if(
ed60: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
ed70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ed80: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
ed90: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
eda0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
edb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
edc0: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
edd0: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
ede0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
edf0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
ee00: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
ee10: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ee20: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
ee30: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
ee40: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
ee50: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
ee60: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
ee70: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
ee80: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 42 6c  CL_ERROR;..  pBl
ee90: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
eea0: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
eeb0: 63 6f 6c 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  col);.  len = sq
eec0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
eed0: 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  es(pStmt, col);.
eee0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
eef0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
ef00: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70  ewByteArrayObj(p
ef10: 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72  Blob, len));.  r
ef20: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ef30: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ef40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
ef50: 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ble STMT column.
ef60: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
ef70: 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
ef80: 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
ef90: 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74  current row cast
efa0: 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f   as a double..*/
efb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
efc0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a  _column_double(.
efd0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
efe0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
eff0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f000: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f010: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f020: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
f030: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
f040: 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61  ol;.  double rVa
f050: 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
f060: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
f070: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f080: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
f090: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
f0a0: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
f0b0: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
f0c0: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
f0d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
f0e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
f0f0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
f100: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
f110: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f120: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
f130: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f140: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
f150: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f160: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
f170: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f180: 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c  R;..  rVal = sql
f190: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
f1a0: 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  le(pStmt, col);.
f1b0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
f1c0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
f1d0: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c  ewDoubleObj(rVal
f1e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
f1f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
f200: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61 74  age: sqlite3_dat
f210: 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a  a_count STMT .**
f220: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
f230: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f240: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
f250: 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53   sql statement S
f260: 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TMT..*/.static i
f270: 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75  nt test_data_cou
f280: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
f290: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
f2a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
f2b0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
f2c0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
f2d0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
f2e0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
f2f0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
f300: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f310: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
f320: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
f330: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
f340: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
f350: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
f360: 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
f370: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f380: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
f390: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
f3a0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
f3b0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
f3c0: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
f3d0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c  CL_ERROR;..  Tcl
f3e0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
f3f0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
f400: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74 61  Obj(sqlite3_data
f410: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
f420: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
f440: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
f450: 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d  _text STMT colum
f460: 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
f470: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
f480: 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  cltype STMT colu
f490: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
f4a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
f4b0: 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ame STMT column.
f4c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
f4d0: 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20 20  st_stmt_utf8(.  
f4e0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f4f0: 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  a,        /* Poi
f500: 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
f510: 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
f520: 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63  e invoke */.  Tc
f530: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f540: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f550: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f560: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f570: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f580: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e    int col;.  con
f590: 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63  st char *(*xFunc
f5a0: 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
f5b0: 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61   int) = clientDa
f5c0: 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta;.  const char
f5d0: 20 2a 7a 52 65 74 3b 0a 0a 20 20 69 66 28 20 6f   *zRet;..  if( o
f5e0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
f5f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f600: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
f610: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
f620: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
f630: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
f640: 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
f650: 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
f660: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f670: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
f680: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
f690: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f6a0: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
f6b0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f6c0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
f6d0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
f6e0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
f6f0: 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
f700: 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
f710: 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
f720: 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
f730: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
f740: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
f750: 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
f760: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
f770: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
f780: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
f790: 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
f7a0: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
f7b0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
f7c0: 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
f7d0: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
f7e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f7f0: 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
f800: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
f810: 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
f820: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f830: 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ata,     /* Poin
f840: 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
f850: 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
f860: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
f870: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f880: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f890: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f8a0: 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
f8b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
f8c0: 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
f8d0: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
f8e0: 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  col;.  Tcl_Obj *
f8f0: 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  pRet;.  const vo
f900: 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63  id *zName16;.  c
f910: 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75  onst void *(*xFu
f920: 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
f930: 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74  *, int) = client
f940: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Data;..  if( obj
f950: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f960: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f970: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f980: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f990: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
f9a0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
f9b0: 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
f9c0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
f9d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f9e0: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
f9f0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
fa00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
fa10: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
fa20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fa30: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
fa40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
fa50: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
fa60: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
fa70: 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36  RROR;..  zName16
fa80: 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
fa90: 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  col);.  if( zNam
faa0: 65 31 36 20 29 7b 0a 20 20 20 20 70 52 65 74 20  e16 ){.    pRet 
fab0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
fac0: 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73  ayObj(zName16, s
fad0: 71 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c  qlite3utf16ByteL
fae0: 65 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b  en(zName16, -1)+
faf0: 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  2);.    Tcl_SetO
fb00: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
fb10: 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64   pRet);.  }.#end
fb20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fb30: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65  T_UTF16 */..  re
fb40: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
fb50: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
fb60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20  ite3_column_int 
fb70: 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
fb80: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
fb90: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54  _column_bytes ST
fba0: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
fbb0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
fbc0: 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54  olumn_bytes16 ST
fbd0: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a  MT column.**.*/.
fbe0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
fbf0: 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64  stmt_int(.  void
fc00: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
fc10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
fc20: 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
fc30: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
fc40: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
fc50: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
fc60: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
fc70: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
fc80: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
fc90: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
fca0: 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e  ol;.  int (*xFun
fcb0: 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
fcc0: 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44  , int) = clientD
fcd0: 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ata;..  if( objc
fce0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
fcf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fd00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
fd10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
fd20: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
fd30: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
fd40: 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
fd50: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
fd60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
fd70: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
fd80: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
fd90: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
fda0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
fdb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fdc0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
fdd0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
fde0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
fdf0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
fe00: 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  ROR;..  Tcl_SetO
fe10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
fe20: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78   Tcl_NewIntObj(x
fe30: 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29  Func(pStmt, col)
fe40: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
fe50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
fe60: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 4f  age:  sqlite3OsO
fe70: 70 65 6e 52 65 61 64 57 72 69 74 65 20 3c 66 69  penReadWrite <fi
fe80: 6c 65 6e 61 6d 65 3e 0a 2a 2f 0a 73 74 61 74 69  lename>.*/.stati
fe90: 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74  c int test_sqlit
fea0: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
feb0: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
fec0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
fed0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
fee0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
fef0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ff00: 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20  ].){.  OsFile * 
ff10: 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pFile;.  int rc;
ff20: 0a 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20  .  int dummy;.  
ff30: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
ff40: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
ff50: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
ff60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ff70: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
ff80: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
ff90: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
ffa0: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
ffb0: 69 6c 65 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  ilename", 0);.  
ffc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ffd0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65  OR;.  }..  pFile
ffe0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
fff0: 73 69 7a 65 6f 66 28 4f 73 46 69 6c 65 29 29 3b  sizeof(OsFile));
10000 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
10010 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 54  sOpenReadWrite(T
10020 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10030 76 5b 31 5d 29 2c 20 70 46 69 6c 65 2c 20 26 64  v[1]), pFile, &d
10040 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 63 21  ummy);.  if( rc!
10050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10060 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 69    sqliteFree(pFi
10070 6c 65 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  le);.    Tcl_Set
10080 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
10090 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65  char *)errorName
100a0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
100b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
100c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d  L_ERROR;.  }.  m
100d0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
100e0 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 46 69 6c  terp, zBuf, pFil
100f0 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  e);.  Tcl_SetRes
10100 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
10110 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
10120 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
10130 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
10140 65 33 4f 73 43 6c 6f 73 65 20 3c 66 69 6c 65 20  e3OsClose <file 
10150 68 61 6e 64 6c 65 3e 0a 2a 2f 0a 73 74 61 74 69  handle>.*/.stati
10160 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74  c int test_sqlit
10170 65 33 4f 73 43 6c 6f 73 65 28 0a 20 20 76 6f 69  e3OsClose(.  voi
10180 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10190 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
101a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
101b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
101c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f  ST objv[].){.  O
101d0 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20  sFile * pFile;. 
101e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
101f0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10200 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10210 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10220 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10230 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
10240 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10250 5b 30 5d 29 2c 20 22 20 66 69 6c 65 68 61 6e 64  [0]), " filehand
10260 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  le", 0);.    ret
10270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10280 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c   }..  if( getFil
10290 65 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  ePointer(interp,
102a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
102b0 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29  bjv[1]), &pFile)
102c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
102d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
102e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 6c  rc = sqlite3OsCl
102f0 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ose(pFile);.  if
10300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10310 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
10320 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
10330 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72  ar *)errorName(r
10340 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
10350 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10360 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
10370 69 74 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a  iteFree(pFile);.
10380 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
103a0 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 20    sqlite3OsLock 
103b0 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 20 3c 6c  <file handle> <l
103c0 6f 63 6b 74 79 70 65 3e 0a 2a 2f 0a 73 74 61 74  ocktype>.*/.stat
103d0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69  ic int test_sqli
103e0 74 65 33 4f 73 4c 6f 63 6b 28 0a 20 20 76 6f 69  te3OsLock(.  voi
103f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10400 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10410 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10420 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10430 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f  ST objv[].){.  O
10440 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20  sFile * pFile;. 
10450 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
10460 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
10470 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10480 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10490 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
104a0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54   \"", .        T
104b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
104c0 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  v[0]), .        
104d0 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48  " filehandle (SH
104e0 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45  ARED|RESERVED|PE
104f0 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29  NDING|EXCLUSIVE)
10500 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
10510 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10520 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65 50  ..  if( getFileP
10530 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10540 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10550 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29  v[1]), &pFile) )
10560 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
10570 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
10580 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 53 48  f( 0==strcmp("SH
10590 41 52 45 44 22 2c 20 54 63 6c 5f 47 65 74 53 74  ARED", Tcl_GetSt
105a0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29  ring(objv[2])) )
105b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
105c0 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  e3OsLock(pFile, 
105d0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
105e0 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d  }.  else if( 0==
105f0 73 74 72 63 6d 70 28 22 52 45 53 45 52 56 45 44  strcmp("RESERVED
10600 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
10610 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20  (objv[2])) ){.  
10620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10630 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 52 45 53 45  Lock(pFile, RESE
10640 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  RVED_LOCK);.  }.
10650 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 74    else if( 0==st
10660 72 63 6d 70 28 22 50 45 4e 44 49 4e 47 22 2c 20  rcmp("PENDING", 
10670 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10680 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72  jv[2])) ){.    r
10690 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
106a0 6b 28 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  k(pFile, PENDING
106b0 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c  _LOCK);.  }.  el
106c0 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70  se if( 0==strcmp
106d0 28 22 45 58 43 4c 55 53 49 56 45 22 2c 20 54 63  ("EXCLUSIVE", Tc
106e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
106f0 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20  [2])) ){.    rc 
10700 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
10710 70 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  pFile, EXCLUSIVE
10720 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 65 6c 73 65 7b  _LOCK);.  }else{
10730 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
10740 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
10750 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
10760 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
10770 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10780 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a 20 20  ng(objv[0]), .  
10790 20 20 20 20 20 20 22 20 66 69 6c 65 68 61 6e 64        " filehand
107a0 6c 65 20 28 53 48 41 52 45 44 7c 52 45 53 45 52  le (SHARED|RESER
107b0 56 45 44 7c 50 45 4e 44 49 4e 47 7c 45 58 43 4c  VED|PENDING|EXCL
107c0 55 53 49 56 45 29 22 2c 20 30 29 3b 0a 20 20 20  USIVE)", 0);.   
107d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
107e0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  R;.  }..  if( rc
107f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10800 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
10810 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
10820 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  )errorName(rc), 
10830 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
10840 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10850 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
10860 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10870 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10880 4f 73 55 6e 6c 6f 63 6b 20 3c 66 69 6c 65 20 68  OsUnlock <file h
10890 61 6e 64 6c 65 3e 0a 2a 2f 0a 73 74 61 74 69 63  andle>.*/.static
108a0 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65   int test_sqlite
108b0 33 4f 73 55 6e 6c 6f 63 6b 28 0a 20 20 76 6f 69  3OsUnlock(.  voi
108c0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
108d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
108e0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
108f0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10900 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f  ST objv[].){.  O
10910 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20  sFile * pFile;. 
10920 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
10930 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10940 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10950 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10960 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10970 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
10980 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10990 5b 30 5d 29 2c 20 22 20 66 69 6c 65 68 61 6e 64  [0]), " filehand
109a0 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  le", 0);.    ret
109b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
109c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c   }..  if( getFil
109d0 65 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  ePointer(interp,
109e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
109f0 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29  bjv[1]), &pFile)
10a00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
10a10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10a20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
10a30 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 4e 4f 5f 4c  lock(pFile, NO_L
10a40 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
10a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10a60 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
10a70 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
10a80 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
10a90 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
10aa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10ab0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
10ac0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
10ad0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73  sage:  sqlite3Os
10ae0 54 65 6d 70 46 69 6c 65 4e 61 6d 65 0a 2a 2f 0a  TempFileName.*/.
10af0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
10b00 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c  sqlite3OsTempFil
10b10 65 4e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20  eName(.  void * 
10b20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10b30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10b40 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10b50 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10b60 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20  bjv[].){.  char 
10b70 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d  zFile[SQLITE_TEM
10b80 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69  PNAME_SIZE];.  i
10b90 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
10ba0 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
10bb0 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 69  Name(zFile);.  i
10bc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10bd0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
10be0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
10bf0 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28  har *)errorName(
10c00 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
10c10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10c20 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
10c30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10c40 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 30 29  nterp, zFile, 0)
10c50 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10c60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
10c70 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  e:  sqlite_set_m
10c80 61 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d  agic  DB  MAGIC-
10c90 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74  NUMBER.**.** Set
10ca0 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76   the db->magic v
10cb0 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75  alue.  This is u
10cc0 73 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f  sed to test erro
10cd0 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63  r recovery logic
10ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10cf0 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
10d00 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10d10 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10d20 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10d30 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
10d40 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
10d50 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
10d60 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
10d70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10d80 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
10d90 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10da0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
10db0 20 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49         " DB MAGI
10dc0 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  C", 0);.    retu
10dd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10de0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
10df0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
10e00 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
10e10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10e20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
10e30 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
10e40 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a  IC_OPEN")==0 ){.
10e50 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
10e60 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
10e70 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  N;.  }else if( s
10e80 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
10e90 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
10ea0 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SED")==0 ){.    
10eb0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
10ec0 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
10ed0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
10ee0 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
10ef0 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22  LITE_MAGIC_BUSY"
10f00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
10f10 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
10f20 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  AGIC_BUSY;.  }el
10f30 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
10f40 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
10f50 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20  AGIC_ERROR")==0 
10f60 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
10f70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
10f80 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
10f90 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
10fa0 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26  terp, argv[2], &
10fb0 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20  db->magic) ){.  
10fc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10fd0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
10fe0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
10ff0 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61  * Usage:  tcl_va
11000 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49  riable_type VARI
11010 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  ABLENAME.**.** R
11020 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
11030 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  f the internal r
11040 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f  epresentation fo
11050 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  r the.** value o
11060 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72 69  f the given vari
11070 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
11080 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c 65  int tcl_variable
11090 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
110a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
110b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
110c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
110d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
110e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f  bjv[].){.  Tcl_O
110f0 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20  bj *pVar;.  if( 
11100 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
11110 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11120 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
11130 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20   "VARIABLE");.  
11140 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11150 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d  OR;.  }.  pVar =
11160 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
11170 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
11180 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30  ring(objv[1]), 0
11190 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f  , TCL_LEAVE_ERR_
111a0 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72  MSG);.  if( pVar
111b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
111c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56  _ERROR;.  if( pV
111d0 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20  ar->typePtr ){. 
111e0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
111f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11200 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61  NewStringObj(pVa
11210 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
11220 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65  , -1));.  }.  re
11230 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11240 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11250 6e 65 20 73 65 74 73 20 65 6e 74 72 69 65 73 20  ne sets entries 
11260 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 3a 3a  in the global ::
11270 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28 29  sqlite_options()
11280 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 0a   array variable.
11290 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
112a0 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  the compile-time
112b0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
112c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
112d0 20 54 65 73 74 0a 2a 2a 20 70 72 6f 63 65 64 75   Test.** procedu
112e0 72 65 73 20 75 73 65 20 74 68 69 73 20 74 6f 20  res use this to 
112f0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
11300 65 73 74 73 20 73 68 6f 75 6c 64 20 62 65 20 6f  ests should be o
11310 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
11320 63 20 76 6f 69 64 20 73 65 74 5f 6f 70 74 69 6f  c void set_optio
11330 6e 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ns(Tcl_Interp *i
11340 6e 74 65 72 70 29 7b 0a 23 69 66 64 65 66 20 53  nterp){.#ifdef S
11350 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
11360 54 41 42 4c 45 0a 20 20 54 63 6c 5f 53 65 74 56  TABLE.  Tcl_SetV
11370 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
11380 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61  ite_options", "a
11390 6c 74 65 72 74 61 62 6c 65 22 2c 20 22 30 22 2c  ltertable", "0",
113a0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
113b0 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53  );.#else.  Tcl_S
113c0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
113d0 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
113e0 20 22 61 6c 74 65 72 74 61 62 6c 65 22 2c 20 22   "altertable", "
113f0 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  1", TCL_GLOBAL_O
11400 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  NLY);.#endif..#i
11410 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
11420 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
11430 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11440 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
11450 69 6f 6e 73 22 2c 20 22 61 75 74 68 22 2c 20 22  ions", "auth", "
11460 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
11470 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63  NLY);.#else.  Tc
11480 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
11490 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
114a0 73 22 2c 20 22 61 75 74 68 22 2c 20 22 31 22 2c  s", "auth", "1",
114b0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
114c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
114d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
114e0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 54 63  TOINCREMENT.  Tc
114f0 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
11500 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
11510 73 22 2c 20 22 61 75 74 6f 69 6e 63 22 2c 20 22  s", "autoinc", "
11520 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
11530 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63  NLY);.#else.  Tc
11540 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
11550 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
11560 73 22 2c 20 22 61 75 74 6f 69 6e 63 22 2c 20 22  s", "autoinc", "
11570 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  1", TCL_GLOBAL_O
11580 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  NLY);.#endif..#i
11590 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
115a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 54 63  _AUTOVACUUM.  Tc
115b0 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
115c0 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
115d0 73 22 2c 20 22 61 75 74 6f 76 61 63 75 75 6d 22  s", "autovacuum"
115e0 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "0", TCL_GLOBA
115f0 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20  L_ONLY);.#else. 
11600 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11610 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
11620 69 6f 6e 73 22 2c 20 22 61 75 74 6f 76 61 63 75  ions", "autovacu
11630 75 6d 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c  um", "1", TCL_GL
11640 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64  OBAL_ONLY);.#end
11650 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11660 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
11670 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
11680 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
11690 56 41 43 55 55 4d 29 20 7c 7c 20 53 51 4c 49 54  VACUUM) || SQLIT
116a0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
116b0 43 55 55 4d 3d 3d 30 0a 20 20 54 63 6c 5f 53 65  CUUM==0.  Tcl_Se
116c0 74 56 61 72 32 28 69 6e 74 65 72 70 2c 22 73 71  tVar2(interp,"sq
116d0 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 22 64  lite_options","d
116e0 65 66 61 75 6c 74 5f 61 75 74 6f 76 61 63 75 75  efault_autovacuu
116f0 6d 22 2c 22 30 22 2c 54 43 4c 5f 47 4c 4f 42 41  m","0",TCL_GLOBA
11700 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20  L_ONLY);.#else. 
11710 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11720 65 72 70 2c 22 73 71 6c 69 74 65 5f 6f 70 74 69  erp,"sqlite_opti
11730 6f 6e 73 22 2c 22 64 65 66 61 75 6c 74 5f 61 75  ons","default_au
11740 74 6f 76 61 63 75 75 6d 22 2c 22 31 22 2c 54 43  tovacuum","1",TC
11750 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
11760 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
11770 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
11780 4c 49 54 45 52 41 4c 0a 20 20 54 63 6c 5f 53 65  LITERAL.  Tcl_Se
11790 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
117a0 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
117b0 22 62 6c 6f 62 6c 69 74 22 2c 20 22 30 22 2c 20  "bloblit", "0", 
117c0 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
117d0 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65  ;.#else.  Tcl_Se
117e0 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
117f0 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
11800 22 62 6c 6f 62 6c 69 74 22 2c 20 22 31 22 2c 20  "bloblit", "1", 
11810 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
11820 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
11830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
11840 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 54  POUND_SELECT.  T
11850 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
11860 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
11870 6e 73 22 2c 20 22 63 6f 6d 70 6f 75 6e 64 22 2c  ns", "compound",
11880 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "0", TCL_GLOBAL
11890 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20  _ONLY);.#else.  
118a0 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
118b0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
118c0 6f 6e 73 22 2c 20 22 63 6f 6d 70 6f 75 6e 64 22  ons", "compound"
118d0 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "1", TCL_GLOBA
118e0 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  L_ONLY);.#endif.
118f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
11900 4d 49 54 5f 43 4f 4e 46 4c 49 43 54 5f 43 4c 41  MIT_CONFLICT_CLA
11910 55 53 45 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  USE.  Tcl_SetVar
11920 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
11930 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 63 6f 6e  e_options", "con
11940 66 6c 69 63 74 22 2c 20 22 30 22 2c 20 54 43 4c  flict", "0", TCL
11950 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
11960 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61  else.  Tcl_SetVa
11970 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
11980 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 63 6f  te_options", "co
11990 6e 66 6c 69 63 74 22 2c 20 22 31 22 2c 20 54 43  nflict", "1", TC
119a0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
119b0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
119c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f  QLITE_OMIT_CURSO
119d0 52 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  R.  Tcl_SetVar2(
119e0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
119f0 6f 70 74 69 6f 6e 73 22 2c 20 22 63 75 72 73 6f  options", "curso
11a00 72 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f  r", "0", TCL_GLO
11a10 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65  BAL_ONLY);.#else
11a20 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69  .  Tcl_SetVar2(i
11a30 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
11a40 70 74 69 6f 6e 73 22 2c 20 22 63 75 72 73 6f 72  ptions", "cursor
11a50 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
11a60 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
11a70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11a80 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55  OMIT_DATETIME_FU
11a90 4e 43 53 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  NCS.  Tcl_SetVar
11aa0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
11ab0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 64 61 74  e_options", "dat
11ac0 65 74 69 6d 65 22 2c 20 22 30 22 2c 20 54 43 4c  etime", "0", TCL
11ad0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
11ae0 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61  else.  Tcl_SetVa
11af0 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
11b00 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 64 61  te_options", "da
11b10 74 65 74 69 6d 65 22 2c 20 22 31 22 2c 20 54 43  tetime", "1", TC
11b20 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
11b30 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
11b40 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
11b50 49 4e 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  IN.  Tcl_SetVar2
11b60 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11b70 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 65 78 70 6c  _options", "expl
11b80 61 69 6e 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47  ain", "0", TCL_G
11b90 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c  LOBAL_ONLY);.#el
11ba0 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  se.  Tcl_SetVar2
11bb0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11bc0 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 65 78 70 6c  _options", "expl
11bd0 61 69 6e 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  ain", "1", TCL_G
11be0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
11bf0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
11c00 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
11c10 5f 50 4f 49 4e 54 0a 20 20 54 63 6c 5f 53 65 74  _POINT.  Tcl_Set
11c20 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
11c30 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
11c40 66 6c 6f 61 74 69 6e 67 70 6f 69 6e 74 22 2c 20  floatingpoint", 
11c50 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "0", TCL_GLOBAL_
11c60 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54  ONLY);.#else.  T
11c70 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
11c80 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
11c90 6e 73 22 2c 20 22 66 6c 6f 61 74 69 6e 67 70 6f  ns", "floatingpo
11ca0 69 6e 74 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  int", "1", TCL_G
11cb0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
11cc0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
11cd0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
11ce0 4b 45 59 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  KEY.  Tcl_SetVar
11cf0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
11d00 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 66 6f 72  e_options", "for
11d10 65 69 67 6e 6b 65 79 22 2c 20 22 30 22 2c 20 54  eignkey", "0", T
11d20 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
11d30 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74  .#else.  Tcl_Set
11d40 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
11d50 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
11d60 66 6f 72 65 69 67 6e 6b 65 79 22 2c 20 22 31 22  foreignkey", "1"
11d70 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
11d80 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  Y);.#endif..#ifd
11d90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
11da0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20  NTEGRITY_CHECK. 
11db0 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11dc0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
11dd0 69 6f 6e 73 22 2c 20 22 69 6e 74 65 67 72 69 74  ions", "integrit
11de0 79 63 6b 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47  yck", "0", TCL_G
11df0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c  LOBAL_ONLY);.#el
11e00 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  se.  Tcl_SetVar2
11e10 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11e20 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 69 6e 74 65  _options", "inte
11e30 67 72 69 74 79 63 6b 22 2c 20 22 31 22 2c 20 54  grityck", "1", T
11e40 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
11e50 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
11e60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
11e70 52 59 44 42 0a 20 20 54 63 6c 5f 53 65 74 56 61  RYDB.  Tcl_SetVa
11e80 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
11e90 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 6d 65  te_options", "me
11ea0 6d 6f 72 79 64 62 22 2c 20 22 30 22 2c 20 54 43  morydb", "0", TC
11eb0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
11ec0 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
11ed0 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
11ee0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 6d  ite_options", "m
11ef0 65 6d 6f 72 79 64 62 22 2c 20 22 31 22 2c 20 54  emorydb", "1", T
11f00 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
11f10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
11f20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11f30 52 5f 50 52 41 47 4d 41 53 0a 20 20 54 63 6c 5f  R_PRAGMAS.  Tcl_
11f40 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
11f50 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
11f60 2c 20 22 70 61 67 65 72 5f 70 72 61 67 6d 61 73  , "pager_pragmas
11f70 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "0", TCL_GLOB
11f80 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a  AL_ONLY);.#else.
11f90 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
11fa0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
11fb0 74 69 6f 6e 73 22 2c 20 22 70 61 67 65 72 5f 70  tions", "pager_p
11fc0 72 61 67 6d 61 73 22 2c 20 22 31 22 2c 20 54 43  ragmas", "1", TC
11fd0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
11fe0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
11ff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
12000 41 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  A.  Tcl_SetVar2(
12010 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
12020 6f 70 74 69 6f 6e 73 22 2c 20 22 70 72 61 67 6d  options", "pragm
12030 61 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f  a", "0", TCL_GLO
12040 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c  BAL_ONLY);.  Tcl
12050 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
12060 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
12070 22 2c 20 22 69 6e 74 65 67 72 69 74 79 63 6b 22  ", "integrityck"
12080 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "0", TCL_GLOBA
12090 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20  L_ONLY);.#else. 
120a0 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
120b0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
120c0 69 6f 6e 73 22 2c 20 22 70 72 61 67 6d 61 22 2c  ions", "pragma",
120d0 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "1", TCL_GLOBAL
120e0 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  _ONLY);.#endif..
120f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12100 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
12110 42 41 43 4b 0a 20 20 54 63 6c 5f 53 65 74 56 61  BACK.  Tcl_SetVa
12120 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
12130 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 70 72  te_options", "pr
12140 6f 67 72 65 73 73 22 2c 20 22 30 22 2c 20 54 43  ogress", "0", TC
12150 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
12160 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
12170 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
12180 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 70  ite_options", "p
12190 72 6f 67 72 65 73 73 22 2c 20 22 31 22 2c 20 54  rogress", "1", T
121a0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
121b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
121c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
121d0 44 45 58 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  DEX.  Tcl_SetVar
121e0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
121f0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 72 65 69  e_options", "rei
12200 6e 64 65 78 22 2c 20 22 30 22 2c 20 54 43 4c 5f  ndex", "0", TCL_
12210 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
12220 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
12230 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
12240 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 72 65 69  e_options", "rei
12250 6e 64 65 78 22 2c 20 22 31 22 2c 20 54 43 4c 5f  ndex", "1", TCL_
12260 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
12270 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
12280 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
12290 50 52 41 47 4d 41 53 0a 20 20 54 63 6c 5f 53 65  PRAGMAS.  Tcl_Se
122a0 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
122b0 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
122c0 22 73 63 68 65 6d 61 5f 70 72 61 67 6d 61 73 22  "schema_pragmas"
122d0 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "0", TCL_GLOBA
122e0 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20  L_ONLY);.#else. 
122f0 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
12300 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
12310 69 6f 6e 73 22 2c 20 22 73 63 68 65 6d 61 5f 70  ions", "schema_p
12320 72 61 67 6d 61 73 22 2c 20 22 31 22 2c 20 54 43  ragmas", "1", TC
12330 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
12340 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
12350 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
12360 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41  A_VERSION_PRAGMA
12370 53 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  S.  Tcl_SetVar2(
12380 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
12390 6f 70 74 69 6f 6e 73 22 2c 20 22 73 63 68 65 6d  options", "schem
123a0 61 5f 76 65 72 73 69 6f 6e 22 2c 20 22 30 22 2c  a_version", "0",
123b0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
123c0 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53  );.#else.  Tcl_S
123d0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
123e0 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
123f0 20 22 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e   "schema_version
12400 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
12410 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
12420 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12430 4f 4d 49 54 5f 54 43 4c 5f 56 41 52 49 41 42 4c  OMIT_TCL_VARIABL
12440 45 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  E.  Tcl_SetVar2(
12450 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
12460 6f 70 74 69 6f 6e 73 22 2c 20 22 74 63 6c 76 61  options", "tclva
12470 72 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f  r", "0", TCL_GLO
12480 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65  BAL_ONLY);.#else
12490 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69  .  Tcl_SetVar2(i
124a0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
124b0 70 74 69 6f 6e 73 22 2c 20 22 74 63 6c 76 61 72  ptions", "tclvar
124c0 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
124d0 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
124e0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 48  ..#if defined(TH
124f0 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48 52  READSAFE) && THR
12500 45 41 44 53 41 46 45 0a 20 20 54 63 6c 5f 53 65  EADSAFE.  Tcl_Se
12510 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
12520 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
12530 22 74 68 72 65 61 64 73 61 66 65 22 2c 20 22 31  "threadsafe", "1
12540 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
12550 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c  LY);.#else.  Tcl
12560 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
12570 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
12580 22 2c 20 22 74 68 72 65 61 64 73 61 66 65 22 2c  ", "threadsafe",
12590 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "0", TCL_GLOBAL
125a0 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  _ONLY);.#endif..
125b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
125c0 49 54 5f 54 52 49 47 47 45 52 0a 20 20 54 63 6c  IT_TRIGGER.  Tcl
125d0 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
125e0 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
125f0 22 2c 20 22 74 72 69 67 67 65 72 22 2c 20 22 30  ", "trigger", "0
12600 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
12610 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c  LY);.#else.  Tcl
12620 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
12630 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
12640 22 2c 20 22 74 72 69 67 67 65 72 22 2c 20 22 31  ", "trigger", "1
12650 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
12660 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  LY);.#endif..#if
12670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12680 55 54 46 31 36 0a 20 20 54 63 6c 5f 53 65 74 56  UTF16.  Tcl_SetV
12690 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
126a0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 75  ite_options", "u
126b0 74 66 31 36 22 2c 20 22 30 22 2c 20 54 43 4c 5f  tf16", "0", TCL_
126c0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
126d0 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
126e0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
126f0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 75 74 66  e_options", "utf
12700 31 36 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c  16", "1", TCL_GL
12710 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64  OBAL_ONLY);.#end
12720 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
12730 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 20 20  E_OMIT_VACUUM.  
12740 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
12750 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
12760 6f 6e 73 22 2c 20 22 76 61 63 75 75 6d 22 2c 20  ons", "vacuum", 
12770 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "0", TCL_GLOBAL_
12780 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54  ONLY);.#else.  T
12790 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
127a0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
127b0 6e 73 22 2c 20 22 76 61 63 75 75 6d 22 2c 20 22  ns", "vacuum", "
127c0 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  1", TCL_GLOBAL_O
127d0 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  NLY);.#endif..#i
127e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
127f0 5f 56 49 45 57 0a 20 20 54 63 6c 5f 53 65 74 56  _VIEW.  Tcl_SetV
12800 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
12810 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 76  ite_options", "v
12820 69 65 77 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47  iew", "0", TCL_G
12830 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c  LOBAL_ONLY);.#el
12840 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  se.  Tcl_SetVar2
12850 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
12860 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 76 69 65 77  _options", "view
12870 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
12880 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
12890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
128a0 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68  er commands with
128b0 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
128c0 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  eter..*/.int Sql
128d0 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
128e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
128f0 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
12900 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
12910 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
12920 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  nt sqlite3_inter
12930 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  rupt_count;.  ex
12940 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
12950 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
12960 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
12970 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
12980 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
12990 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
129a0 74 69 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 73  time;.  static s
129b0 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
129c0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
129d0 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  cl_CmdProc *xPro
129e0 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20  c;.  } aCmd[] = 
129f0 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  {.     { "sqlite
12a00 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  3_mprintf_int", 
12a10 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
12a20 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
12a30 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d  mprintf_int    }
12a40 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12a50 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22  3_mprintf_int64"
12a60 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ,         (Tcl_C
12a70 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
12a80 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d  mprintf_int64  }
12a90 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12aa0 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20  3_mprintf_str", 
12ab0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
12ac0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
12ad0 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d  mprintf_str    }
12ae0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12af0 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
12b00 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  y",       (Tcl_C
12b10 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
12b20 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d  mprintf_stronly}
12b30 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12b40 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
12b50 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
12b60 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
12b70 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d  mprintf_double }
12b80 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12b90 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
12ba0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
12bb0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
12bc0 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d  mprintf_scaled }
12bd0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12be0 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
12bf0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
12c00 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
12c10 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c  intf_z        },
12c20 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
12c30 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
12c40 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d  id",     (Tcl_Cm
12c50 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74  dProc*)test_last
12c60 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a  _rowid       },.
12c70 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
12c80 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20  exec_printf",   
12c90 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
12ca0 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
12cb0 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20  printf      },. 
12cc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
12cd0 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22  et_table_printf"
12ce0 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
12cf0 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61  roc*)test_get_ta
12d00 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20 20  ble_printf },.  
12d10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
12d20 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
12d30 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
12d40 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
12d50 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20  close     },.   
12d60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
12d70 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ate_function",  
12d80 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
12d90 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66  c*)test_create_f
12da0 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20  unction  },.    
12db0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
12dc0 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20  te_aggregate",  
12dd0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
12de0 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  *)test_create_ag
12df0 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20  gregate },.     
12e00 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74  { "sqlite_regist
12e10 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
12e20 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
12e30 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66  )test_register_f
12e40 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  unc    },.     {
12e50 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c   "sqlite_abort",
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
12e80 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20  sqlite_abort    
12e90 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20        },.#ifdef 
12ea0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
12eb0 20 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c    { "sqlite_mall
12ec0 6f 63 5f 66 61 69 6c 22 2c 20 20 20 20 20 20 20  oc_fail",       
12ed0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
12ee0 63 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  c*)sqlite_malloc
12ef0 5f 66 61 69 6c 20 20 20 20 7d 2c 0a 20 20 20 20  _fail    },.    
12f00 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   { "sqlite_mallo
12f10 63 5f 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  c_stat",        
12f20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
12f30 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  *)sqlite_malloc_
12f40 73 74 61 74 20 20 20 20 7d 2c 0a 23 65 6e 64 69  stat    },.#endi
12f50 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
12f60 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20  _bind",         
12f70 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
12f80 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e  mdProc*)test_bin
12f90 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  d             },
12fa0 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f  .     { "breakpo
12fb0 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
12fc0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
12fd0 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61  dProc*)test_brea
12fe0 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  kpoint       },.
12ff0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
13000 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
13010 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
13020 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20  Proc*)test_key  
13030 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
13040 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
13050 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  ekey",          
13060 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
13070 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20  roc*)test_rekey 
13080 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
13090 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74     { "sqlite_set
130a0 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20 20 20  _magic",        
130b0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
130c0 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d  oc*)sqlite_set_m
130d0 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 7d  agic      },.  }
130e0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
130f0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
13100 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
13110 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
13120 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
13130 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
13140 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
13150 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
13160 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
13170 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
13180 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ,      0 },.    
13190 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
131a0 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
131b0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
131c0 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  t64,    0 },.   
131d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
131e0 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  d_double",      
131f0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64       test_bind_d
13200 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20  ouble,   0 },.  
13210 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
13220 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20  nd_null",       
13230 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
13240 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20  null     ,0 },. 
13250 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
13260 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20  ind_text",      
13270 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
13280 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _text     ,0 },.
13290 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
132a0 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20  bind_text16",   
132b0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
132c0 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c  d_text16   ,0 },
132d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
132e0 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20  _bind_blob",    
132f0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
13300 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d  nd_blob     ,0 }
13310 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
13320 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
13330 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62  _count",  test_b
13340 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
13350 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  unt, 0},.     { 
13360 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
13370 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20  rameter_name",  
13380 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
13390 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a  eter_name,  0},.
133a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
133b0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
133c0 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e  ndex",  test_bin
133d0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
133e0 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  x, 0},.     { "s
133f0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcode",
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
13410 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20  est_errcode     
13420 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
13430 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c  sqlite3_errmsg",
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20  test_errmsg     
13460 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
13470 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  "sqlite3_errmsg1
13480 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
13490 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20   test_errmsg16  
134a0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
134b0 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c   "sqlite3_open",
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134d0 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20    test_open     
134e0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
134f0 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  { "sqlite3_open1
13500 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
13510 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20     test_open16  
13520 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
13530 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d 70   { "sqlite3_comp
13540 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20 20 20  lete16",        
13550 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74      test_complet
13560 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20  e16    ,0 },..  
13570 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
13580 65 70 61 72 65 22 2c 20 20 20 20 20 20 20 20 20  epare",         
13590 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
135a0 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  re       ,0 },. 
135b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
135c0 72 65 70 61 72 65 31 36 22 2c 20 20 20 20 20 20  repare16",      
135d0 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
135e0 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a  are16     ,0 },.
135f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
13600 66 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20  finalize",      
13610 20 20 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e          test_fin
13620 61 6c 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c  alize      ,0 },
13630 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
13640 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20  _reset",        
13650 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65           test_re
13660 73 65 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d  set         ,0 }
13670 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
13680 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  3_changes",     
13690 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
136a0 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20  hanges       ,0 
136b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
136c0 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20  e3_step",       
136d0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
136e0 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30  step          ,0
136f0 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c   },..     /* sql
13700 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20  ite3_column_*() 
13710 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73  API */.     { "s
13720 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
13730 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74  unt",          t
13740 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
13750 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
13760 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
13770 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
13780 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20  test_data_count 
13790 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
137a0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
137b0 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
137c0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
137d0 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  e   ,0 },.     {
137e0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
137f0 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  _blob",         
13800 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c    test_column_bl
13810 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  ob   ,0 },.     
13820 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
13830 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  n_double",      
13840 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64     test_column_d
13850 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20  ouble ,0 },.    
13860 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
13870 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  mn_int64",      
13880 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
13890 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20  int64  ,0 },.   
138a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
138b0 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 20 20 20  umn_text",      
138c0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
138d0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
138e0 5f 74 65 78 74 20 20 20 20 20 20 7d 2c 0a 20 20  _text      },.  
138f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
13900 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 20  lumn_decltype", 
13910 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
13920 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ,  sqlite3_colum
13930 6e 5f 64 65 63 6c 74 79 70 65 20 20 7d 2c 0a 20  n_decltype  },. 
13940 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
13950 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 20  olumn_name",    
13960 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
13970 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  8,  sqlite3_colu
13980 6d 6e 5f 6e 61 6d 65 20 20 20 20 20 20 7d 2c 0a  mn_name      },.
13990 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
139a0 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20  column_int",    
139b0 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
139c0 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  t,   sqlite3_col
139d0 75 6d 6e 5f 69 6e 74 20 20 20 20 20 20 20 7d 2c  umn_int       },
139e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
139f0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20  _column_bytes", 
13a00 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69       test_stmt_i
13a10 6e 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  nt,   sqlite3_co
13a20 6c 75 6d 6e 5f 62 79 74 65 73 20 20 20 20 20 7d  lumn_bytes     }
13a30 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
13a40 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
13a50 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
13a60 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20 20 20  mn_bytes16",    
13a70 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
13a80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13a90 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20 20 20  bytes16   },.   
13aa0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
13ab0 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 20 20  umn_text16",    
13ac0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
13ad0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
13ae0 5f 74 65 78 74 31 36 20 20 20 20 7d 2c 0a 20 20  _text16    },.  
13af0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
13b00 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22  lumn_decltype16"
13b10 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  , test_stmt_utf1
13b20 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  6, sqlite3_colum
13b30 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 20  n_decltype16},. 
13b40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
13b50 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20  olumn_name16",  
13b60 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
13b70 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  16, sqlite3_colu
13b80 6d 6e 5f 6e 61 6d 65 31 36 20 20 20 20 7d 2c 0a  mn_name16    },.
13b90 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 2f 2a 20  #endif..     /* 
13ba0 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f  Functions from o
13bb0 73 2e 68 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73  s.h */.     { "s
13bc0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
13bd0 57 72 69 74 65 22 2c 74 65 73 74 5f 73 71 6c 69  Write",test_sqli
13be0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
13bf0 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  te, 0 },.     { 
13c00 22 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 22  "sqlite3OsClose"
13c10 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71  ,        test_sq
13c20 6c 69 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30 20  lite3OsClose, 0 
13c30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
13c40 65 33 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20 20  e3OsLock",      
13c50 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f     test_sqlite3O
13c60 73 4c 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20 20  sLock, 0 },.    
13c70 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 54 65 6d   { "sqlite3OsTem
13c80 70 46 69 6c 65 4e 61 6d 65 22 2c 20 74 65 73 74  pFileName", test
13c90 5f 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69  _sqlite3OsTempFi
13ca0 6c 65 4e 61 6d 65 2c 20 30 20 7d 2c 0a 20 20 20  leName, 0 },.   
13cb0 0a 20 20 20 20 20 2f 2a 20 43 75 73 74 6f 6d 20  .     /* Custom 
13cc0 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20  test interfaces 
13cd0 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  */.     { "sqlit
13ce0 65 33 4f 73 55 6e 6c 6f 63 6b 22 2c 20 20 20 20  e3OsUnlock",    
13cf0 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65       test_sqlite
13d00 33 4f 73 55 6e 6c 6f 63 6b 2c 20 30 20 20 20 20  3OsUnlock, 0    
13d10 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
13d20 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
13d30 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f    { "add_test_co
13d40 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74  llate",        t
13d50 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20  est_collate, 0  
13d60 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
13d70 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f    { "add_test_co
13d80 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74  llate_needed", t
13d90 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
13da0 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20  ed, 0     },.   
13db0 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75    { "add_test_fu
13dc0 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74  nction",       t
13dd0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20  est_function, 0 
13de0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e            },.#en
13df0 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
13e00 74 65 33 5f 63 72 61 73 68 70 61 72 61 6d 73 22  te3_crashparams"
13e10 2c 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ,     sqlite3_cr
13e20 61 73 68 70 61 72 61 6d 73 2c 20 30 20 20 20 20  ashparams, 0    
13e30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
13e40 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22  te3_test_errstr"
13e50 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74  ,     test_errst
13e60 72 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  r, 0            
13e70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f   },.     { "tcl_
13e80 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20  variable_type", 
13e90 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62        tcl_variab
13ea0 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20  le_type, 0      
13eb0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
13ec0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
13ed0 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b  qlite3_os_trace;
13ee0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ..  for(i=0; i<s
13ef0 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65  izeof(aCmd)/size
13f00 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b  of(aCmd[0]); i++
13f10 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
13f20 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
13f30 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20   aCmd[i].zName, 
13f40 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30  aCmd[i].xProc, 0
13f50 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  , 0);.  }.  for(
13f60 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
13f70 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f  bjCmd)/sizeof(aO
13f80 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  bjCmd[0]); i++){
13f90 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
13fa0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13fb0 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61  , aObjCmd[i].zNa
13fc0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62  me, .        aOb
13fd0 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61  jCmd[i].xProc, a
13fe0 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74  ObjCmd[i].client
13ff0 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Data, 0);.  }.  
14000 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
14010 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72  rp, "sqlite_sear
14020 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ch_count", .    
14030 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
14040 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20  3_search_count, 
14050 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
14060 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
14070 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72  erp, "sqlite_sor
14080 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  t_count", .     
14090 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
140a0 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  _sort_count, TCL
140b0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
140c0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
140d0 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72  , "sqlite_interr
140e0 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  upt_count", .   
140f0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
14100 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
14110 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
14120 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
14130 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
14140 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
14150 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
14160 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66  )&sqlite3_open_f
14170 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ile_count, TCL_L
14180 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
14190 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
141a0 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f  "sqlite_current_
141b0 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63  time", .      (c
141c0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75  har*)&sqlite3_cu
141d0 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f  rrent_time, TCL_
141e0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
141f0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
14200 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63   "sqlite_os_trac
14210 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
14220 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61  )&sqlite3_os_tra
14230 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
14240 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
14250 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
14260 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
14270 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
14280 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
14290 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
142a0 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
142b0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
142c0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d  erp, "sqlite_tem
142d0 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20  p_directory",.  
142e0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
142f0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
14300 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  ry, TCL_LINK_STR
14310 49 4e 47 29 3b 0a 20 20 73 65 74 5f 6f 70 74 69  ING);.  set_opti
14320 6f 6e 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ons(interp);.  r
14330 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.