/ Hex Artifact Content
Login

Artifact 0a71a150659dd261be775c5eb60ae6c0c856c8a5:


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 32 37 20 32 30 30 35 2f 30 31  ,v 1.127 2005/01
0240: 2f 32 32 20 30 33 3a 30 33 3a 35 35 20 64 72 68  /22 03:03:55 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 65 78 74 65 72 6e 20 76 6f 69 64 20  ;.  extern void 
38d0: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
38e0: 69 74 65 33 2a 29 3b 0a 0a 20 20 69 66 28 20 61  ite3*);..  if( a
38f0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
3900: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3910: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3920: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3930: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
3940: 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20 30 29       " DB\"", 0)
3950: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3960: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3970: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3980: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
3990: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
39a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
39b0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
39c0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63  unction(db, "x_c
39d0: 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53 51  oalesce", -1, SQ
39e0: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20  LITE_ANY, 0, .  
39f0: 20 20 20 20 20 20 69 66 6e 75 6c 6c 46 75 6e 63        ifnullFunc
3a00: 2c 20 30 2c 20 30 29 3b 0a 0a 23 69 66 6e 64 65  , 0, 0);..#ifnde
3a10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
3a20: 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  F16.  /* Use the
3a30: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
3a40: 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41 50 49  function16() API
3a50: 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f   here. Mainly fo
3a60: 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20  r fun, but also 
3a70: 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74  .  ** because it
3a80: 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64 20 61   is not tested a
3a90: 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f  nywhere else. */
3aa0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
3ab0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
3ac0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
3ad0: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
3ae0: 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
3af0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
3b00: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
3b10: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
3b20: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
3b30: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
3b40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
3b50: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
3b60: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
3b70: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
3b80: 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
3b90: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 2c 0a  E_UTF16NATIVE),.
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
3bb0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64   SQLITE_UTF16, d
3bc0: 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  b, sqlite3ExecFu
3bd0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nc, 0, 0);.    s
3be0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
3bf0: 70 56 61 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pVal);.  }.#endi
3c00: 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
3c10: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
3c20: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
3c30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3c40: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
3c50: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
3c60: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  errorName(rc), 0
3c70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3c80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  OK;.}../*.** Rou
3c90: 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65  tines to impleme
3ca0: 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28 29  nt the x_count()
3cb0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
3cc0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
3cd0: 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20  struct CountCtx 
3ce0: 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74  CountCtx;.struct
3cf0: 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e   CountCtx {.  in
3d00: 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76  t n;.};.static v
3d10: 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73 71  oid countStep(sq
3d20: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3d30: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
3d40: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3d50: 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74  **argv){.  Count
3d60: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
3d70: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
3d80: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
3d90: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
3da0: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
3db0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
3dc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
3dd0: 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20  argv[0]) ) && p 
3de0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
3df0: 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76   }.}   .static v
3e00: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
3e10: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
3e20: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43  t *context){.  C
3e30: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
3e40: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
3e50: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
3e60: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
3e70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
3e80: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
3e90: 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d  p ? p->n : 0);.}
3ea0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
3eb0: 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61  sqlite_test_crea
3ec0: 74 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a  te_aggregate DB.
3ed0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73  **.** Call the s
3ee0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
3ef0: 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68  nction API on th
3f00: 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
3f10: 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20   in order.** to 
3f20: 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f  create a functio
3f30: 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74  n named "x_count
3f40: 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ".  This functio
3f50: 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  n does the same 
3f60: 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20  thing.** as the 
3f70: 22 6d 64 35 73 75 6d 22 20 66 75 6e 63 74 69 6f  "md5sum" functio
3f80: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  n..**.** The ori
3f90: 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e  ginal motivation
3fa0: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
3fb0: 65 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65  e was to be able
3fc0: 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20   to call the.** 
3fd0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61  sqlite3_create_a
3fe0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
3ff0: 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20  n while a query 
4000: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69  is in progress i
4010: 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65  n order.** to te
4020: 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  st the SQLITE_MI
4030: 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c  SUSE detection l
4040: 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ogic..*/.static 
4050: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
4060: 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69  aggregate(.  voi
4070: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4080: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4090: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
40a0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
40b0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
40c0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
40d0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
40e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
40f0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4100: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4110: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4120: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4130: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
4140: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
4150: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
4160: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4170: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4180: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4190: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
41a0: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
41b0: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
41c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
41d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
41e0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
41f0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4200: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4210: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
4220: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
4230: 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c  n(db, "x_count",
4240: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
4250: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 63 6f 75   0, 0,.      cou
4260: 6e 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e 61  ntStep,countFina
4270: 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  lize);.  if( rc=
4280: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4290: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
42a0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
42b0: 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49  _count", 1, SQLI
42c0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20  TE_UTF8, 0, 0,. 
42d0: 20 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65 70         countStep
42e0: 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b  ,countFinalize);
42f0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
4300: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
4310: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
4320: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4330: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
4340: 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  K;.}..../*.** Us
4350: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
4360: 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54  rintf_int FORMAT
4370: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
4380: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43   INTEGER.**.** C
4390: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
43a0: 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61   three integer a
43b0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
43c0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
43d0: 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f  printf_int(.  vo
43e0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
43f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4400: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4410: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4420: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4430: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
4440: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4450: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4460: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
4470: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4480: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
4490: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
44a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c  /.){.  int a[3],
44b0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
44c0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
44d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
44e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
44f0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4500: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4510: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
4520: 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c  MAT INT INT INT\
4530: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4540: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4550: 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35  }.  for(i=2; i<5
4560: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4570: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
4580: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
4590: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
45a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
45b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
45c0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
45d0: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
45e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
45f0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
4600: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4610: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
4620: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
4630: 20 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73   zNum represents
4640: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
4650: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 36 34 2d   will fit in 64-
4660: 62 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a  bits, then set.*
4670: 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61  * *pValue to tha
4680: 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65  t integer and re
4690: 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65  turn true.  Othe
46a0: 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c  rwise return fal
46b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
46c0: 74 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36  t sqlite3GetInt6
46d0: 34 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  4(const char *zN
46e0: 75 6d 2c 20 69 36 34 20 2a 70 56 61 6c 75 65 29  um, i64 *pValue)
46f0: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  {.  if( sqlite3F
4700: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 4e 75 6d  itsIn64Bits(zNum
4710: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4720: 61 74 6f 69 36 34 28 7a 4e 75 6d 2c 20 70 56 61  atoi64(zNum, pVa
4730: 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  lue);.    return
4740: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4750: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61   0;.}../*.** Usa
4760: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
4770: 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41  intf_int64 FORMA
4780: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
4790: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
47a0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
47b0: 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69  h three 64-bit i
47c0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
47d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
47e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
47f0: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  nt64(.  void *No
4800: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4810: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4820: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4830: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4840: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4850: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4870: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4880: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4890: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
48a0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48b0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
48c0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
48d0: 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63  _int64 a[3];.  c
48e0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
48f0: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
4900: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4910: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4920: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4930: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4940: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
4950: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
4960: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4970: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
4980: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
4990: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
49a0: 33 47 65 74 49 6e 74 36 34 28 61 72 67 76 5b 69  3GetInt64(argv[i
49b0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a 20  ], &a[i-2]) ){. 
49c0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
49d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
49e0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  rgument is not a
49f0: 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e   valid 64-bit in
4a00: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
4a10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4a20: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
4a30: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
4a40: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
4a50: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
4a60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4a70: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
4a80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4a90: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
4aa0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
4ab0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
4ac0: 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41  printf_str FORMA
4ad0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
4ae0: 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  R STRING.**.** C
4af0: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
4b00: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
4b10: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73  uments and one s
4b20: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a  tring argument.*
4b30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
4b40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
4b50: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4b60: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4b70: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4b80: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4b90: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4ba0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4bb0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4bd0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4be0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4c00: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4c10: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
4c20: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72   a[3], i;.  char
4c30: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
4c40: 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20  4 || argc>5 ){. 
4c50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4c60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4c70: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4c80: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4c90: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
4ca0: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
4cb0: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
4cc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4cd0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
4ce0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
4cf0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
4d00: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
4d10: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
4d20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4d30: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
4d40: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
4d50: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
4d60: 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e  >4 ? argv[4] : N
4d70: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
4d80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4d90: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
4da0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
4db0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4dc0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4dd0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
4de0: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
4df0: 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a  INTEGER DOUBLE.*
4e00: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
4e10: 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67  f with two integ
4e20: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  er arguments and
4e30: 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75   one double argu
4e40: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ment.*/.static i
4e50: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
4e60: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
4e70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4e80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4e90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4ea0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4eb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4ec0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
4ed0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4ee0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4ef0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4f00: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4f10: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4f20: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4f30: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
4f40: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
4f50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
4f60: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
4f70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4f80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4f90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4fa0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
4fb0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
4fc0: 4e 54 20 49 4e 54 20 53 54 52 49 4e 47 5c 22 22  NT INT STRING\""
4fd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4fe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4ff0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
5000: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
5010: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
5020: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
5030: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
5040: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
5050: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
5060: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
5070: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
5080: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
5090: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
50a0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
50b0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
50c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
50d0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
50e0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
50f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5100: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5110: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
5120: 72 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20  r FORMAT DOUBLE 
5130: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
5140: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61  l mprintf with a
5150: 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61   single double a
5160: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
5170: 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20   the product of 
5180: 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d  the.** two argum
5190: 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65  ents given above
51a0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
51b0: 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72  to generate over
51c0: 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c  flow and underfl
51d0: 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f  ow.** doubles to
51e0: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20   test that they 
51f0: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72  are converted pr
5200: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  operly..*/.stati
5210: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
5220: 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20  rintf_scaled(.  
5230: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
5240: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5250: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
5260: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
5270: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
5280: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
5290: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
52a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
52b0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
52c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
52d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
52e0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
52f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5300: 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20    double r[2];. 
5310: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
5320: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
5330: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5340: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
5350: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
5360: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
5370: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44        " FORMAT D
5380: 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c  OUBLE DOUBLE\"",
5390: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
53a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
53b0: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
53c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
53d0: 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72  _GetDouble(inter
53e0: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69  p, argv[i], &r[i
53f0: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
5400: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
5410: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
5420: 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d  tf(argv[1], r[0]
5430: 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70  *r[1]);.  Tcl_Ap
5440: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5450: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
5460: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
5470: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
5480: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
5490: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
54a0: 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54  tronly FORMAT ST
54b0: 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  RING.**.** Call 
54c0: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73  mprintf with a s
54d0: 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67  ingle double arg
54e0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74  ument which is t
54f0: 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68  he product of th
5500: 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e  e.** two argumen
5510: 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20  ts given above. 
5520: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
5530: 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c   generate overfl
5540: 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77  ow and underflow
5550: 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74  .** doubles to t
5560: 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72  est that they ar
5570: 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70  e converted prop
5580: 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erly..*/.static 
5590: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
55a0: 6e 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76  ntf_stronly(.  v
55b0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
55c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
55d0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
55e0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
55f0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
5600: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
5610: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
5620: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5630: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5640: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
5650: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
5660: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
5670: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
5680: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
5690: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
56a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
56b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
56c0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
56d0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
56e0: 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c  ORMAT STRING\"",
56f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5700: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5710: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
5720: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72  intf(argv[1], ar
5730: 67 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70  gv[2]);.  Tcl_Ap
5740: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5750: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
5760: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
5770: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
5780: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
5790: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
57a0: 20 4e 20 20 3f 52 45 50 45 41 54 2d 49 4e 54 45   N  ?REPEAT-INTE
57b0: 52 56 41 4c 3f 0a 2a 2a 0a 2a 2a 20 52 69 67 20  RVAL?.**.** Rig 
57c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 74  sqliteMalloc() t
57d0: 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 4e 2d  o fail on the N-
57e0: 74 68 20 63 61 6c 6c 20 61 6e 64 20 65 76 65 72  th call and ever
57f0: 79 20 52 45 50 45 41 54 2d 49 4e 54 45 52 56 41  y REPEAT-INTERVA
5800: 4c 20 63 61 6c 6c 0a 2a 2a 20 61 66 74 65 72 20  L call.** after 
5810: 74 68 61 74 2e 20 20 49 66 20 52 45 50 45 41 54  that.  If REPEAT
5820: 2d 49 4e 54 45 52 56 41 4c 20 69 73 20 30 20 6f  -INTERVAL is 0 o
5830: 72 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  r is omitted, th
5840: 65 6e 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  en only a single
5850: 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 77 69 6c 6c 20  .** malloc will 
5860: 66 61 69 6c 2e 20 20 49 66 20 52 45 50 45 41 54  fail.  If REPEAT
5870: 2d 49 4e 54 45 52 56 41 4c 20 69 73 20 31 20 74  -INTERVAL is 1 t
5880: 68 65 6e 20 61 6c 6c 20 6d 61 6c 6c 6f 63 73 20  hen all mallocs 
5890: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 66 69 72  after the.** fir
58a0: 73 74 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  st failure will 
58b0: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 66 61 69 6c  continue to fail
58c0: 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e 20   on every call. 
58d0: 20 49 66 20 52 45 50 45 41 54 2d 49 4e 54 45 52   If REPEAT-INTER
58e0: 56 41 4c 20 69 73 0a 2a 2a 20 32 20 74 68 65 6e  VAL is.** 2 then
58f0: 20 65 76 65 72 79 20 6f 74 68 65 72 20 6d 61 6c   every other mal
5900: 6c 6f 63 20 77 69 6c 6c 20 66 61 69 6c 2e 20 20  loc will fail.  
5910: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
5920: 0a 2a 2a 20 54 75 72 6e 20 6f 66 66 20 74 68 69  .** Turn off thi
5930: 73 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20  s mechanism and 
5940: 72 65 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  reset the sqlite
5950: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
5960: 76 61 72 69 61 62 6c 65 20 69 73 20 4e 3d 3d 30  variable is N==0
5970: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5980: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 73 74 61 74  TE_MEMDEBUG.stat
5990: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61  ic int sqlite_ma
59a0: 6c 6c 6f 63 5f 66 61 69 6c 28 0a 20 20 76 6f 69  lloc_fail(.  voi
59b0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
59c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
59d0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
59e0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
59f0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
5a00: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
5a10: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
5a20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
5a30: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
5a40: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
5a50: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
5a60: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
5a70: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  .){.  int n;.  i
5a80: 6e 74 20 72 65 70 3b 0a 20 20 69 66 28 20 61 72  nt rep;.  if( ar
5a90: 67 63 21 3d 32 20 26 26 20 61 72 67 63 21 3d 33  gc!=2 && argc!=3
5aa0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5ab0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5ac0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
5ad0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
5ae0: 72 67 76 5b 30 5d 2c 20 22 20 4e 5c 22 22 2c 20  rgv[0], " N\"", 
5af0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5b00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5b10: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
5b20: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
5b30: 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
5b40: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 61 72  _ERROR;.  if( ar
5b50: 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 69 66 28  gc==3 ){.    if(
5b60: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
5b70: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 72 65  rp, argv[2], &re
5b80: 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  p) ) return TCL_
5b90: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
5ba0: 20 20 20 20 72 65 70 20 3d 20 30 3b 0a 20 20 7d      rep = 0;.  }
5bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c  .  sqlite3_iMall
5bc0: 6f 63 46 61 69 6c 20 3d 20 6e 3b 0a 20 20 73 71  ocFail = n;.  sq
5bd0: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 52 65 73  lite3_iMallocRes
5be0: 65 74 20 3d 20 72 65 70 3b 0a 20 20 73 71 6c 69  et = rep;.  sqli
5bf0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
5c00: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
5c10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
5c20: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
5c30: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61  qlite_malloc_sta
5c40: 74 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  t.**.** Return t
5c50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69  he number of pri
5c60: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  or calls to sqli
5c70: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 73  teMalloc() and s
5c80: 71 6c 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  qliteFree()..*/.
5c90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  #ifdef SQLITE_ME
5ca0: 4d 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  MDEBUG.static in
5cb0: 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  t sqlite_malloc_
5cc0: 73 74 61 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  stat(.  void *No
5cd0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
5ce0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
5cf0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
5d00: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
5d10: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5d20: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d40: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
5d50: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
5d60: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
5d70: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
5d80: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
5d90: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
5da0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
5db0: 20 22 25 64 20 25 64 20 25 64 22 2c 20 73 71 6c   "%d %d %d", sql
5dc0: 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2c 20 73 71  ite3_nMalloc, sq
5dd0: 6c 69 74 65 33 5f 6e 46 72 65 65 2c 20 73 71 6c  lite3_nFree, sql
5de0: 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
5df0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
5e00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
5e10: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
5e20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
5e30: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
5e40: 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a   sqlite_abort.**
5e50: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
5e60: 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61   process immedia
5e70: 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e  tely.  This is n
5e80: 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64  ot a clean shutd
5e90: 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d  own..** This com
5ea0: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
5eb0: 74 65 73 74 20 74 68 65 20 72 65 63 6f 76 65 72  test the recover
5ec0: 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74  ability of a dat
5ed0: 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20  abase in.** the 
5ee0: 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72  event of a progr
5ef0: 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61  am crash..*/.sta
5f00: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 61  tic int sqlite_a
5f10: 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  bort(.  void *No
5f20: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
5f30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
5f40: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
5f50: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
5f60: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5f70: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f90: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
5fa0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
5fb0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
5fc0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
5fd0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
5fe0: 20 61 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d   assert( interp=
5ff0: 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20  =0 );   /* This 
6000: 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c  will always fail
6010: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
6020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
6030: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
6040: 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64 65  ine is a user-de
6050: 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69  fined SQL functi
6060: 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65  on whose purpose
6070: 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74  .** is to test t
6080: 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65  he sqlite_set_re
6090: 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73  sult() API..*/.s
60a0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 46  tatic void testF
60b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
60c0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
60d0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
60e0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
60f0: 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20   while( argc>=2 
6100: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
6110: 72 20 2a 7a 41 72 67 30 20 3d 20 73 71 6c 69 74  r *zArg0 = sqlit
6120: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6130: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[0]);.    if( 
6140: 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69  zArg0 ){.      i
6150: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
6160: 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74  ICmp(zArg0, "int
6170: 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ") ){.        sq
6180: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
6190: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
61a0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
61b0: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
61c0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
61d0: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74  rICmp(zArg0,"int
61e0: 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  64")==0 ){.     
61f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6200: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
6210: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6220: 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a  nt64(argv[1]));.
6230: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6240: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
6250: 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d  Arg0,"string")==
6260: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
6270: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6280: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
6290: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
62a0: 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20  v[1]), -1,.     
62b0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
62c0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
62d0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
62e0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
62f0: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
6300: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
6310: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
6320: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
6330: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
6340: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
6350: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
6360: 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c  ICmp(zArg0,"null
6370: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
6380: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6390: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
63a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
63b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
63c0: 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20  rg0,"value")==0 
63d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
63e0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
63f0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71  context, argv[sq
6400: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
6410: 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20  argv[1])]);.    
6420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6430: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
6440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6450: 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  se{.      goto e
6460: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
6470: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
6480: 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
6490: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72  }.  return;..err
64a0: 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
64b0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
64c0: 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61 72  ontext,"first ar
64d0: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
64e0: 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
64f0: 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69   "int int64 stri
6500: 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76  ng double null v
6510: 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f  alue", -1);.}../
6520: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
6530: 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
6540: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20  st_function  DB 
6550: 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69   NAME.**.** Regi
6560: 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53 51  ster the test SQ
6570: 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  L function on th
6580: 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75 6e  e database DB un
6590: 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d  der the name NAM
65a0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
65b0: 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66   test_register_f
65c0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
65d0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
65e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
65f0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
6600: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
6610: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
6620: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
6630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6640: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
6650: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
6660: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
6670: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
6680: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
6690: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
66a0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67  nt rc;.  if( arg
66b0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
66c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
66d0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
66e0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
66f0: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
6700: 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f      " DB FUNCTIO
6710: 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20  N-NAME", 0);.   
6720: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6730: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
6740: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
6750: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
6760: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6770: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
6780: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6790: 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
67a0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
67b0: 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46   0, .      testF
67c0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
67d0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54  ( rc!=0 ){.    T
67e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
67f0: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
6800: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
6810: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6820: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ROR;.  }.  if( s
6830: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
6840: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
6850: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
6860: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
6870: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
6880: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
6890: 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a  finalize  STMT .
68a0: 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  **.** Finalize a
68b0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
68c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
68d0: 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a   test_finalize(.
68e0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
68f0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
6900: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
6910: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
6920: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
6930: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
6940: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
6950: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
6960: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
6970: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
6980: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6990: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
69a0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
69b0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
69c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
69d0: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
69e0: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
69f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6a00: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
6a10: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
6a20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
6a30: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
6a40: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
6a50: 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  OR;..  if( pStmt
6a60: 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d   ){.    db = Stm
6a70: 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20  tToDb(pStmt);.  
6a80: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
6a90: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
6aa0: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
6ab0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
6ac0: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  *)errorName(rc),
6ad0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
6ae0: 69 66 28 20 64 62 20 26 26 20 73 71 6c 69 74 65  if( db && sqlite
6af0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
6b00: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
6b10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6b20: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
6b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
6b40: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
6b50: 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69    STMT .**.** Fi
6b60: 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65  nalize a stateme
6b70: 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  nt handle..*/.st
6b80: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65  atic int test_re
6b90: 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  set(.  void * cl
6ba0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
6bb0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
6bc0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
6bd0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
6be0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
6bf0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
6c00: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
6c10: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
6c20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6c30: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
6c40: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
6c50: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
6c60: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6c70: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
6c80: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
6c90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6ca0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
6cb0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
6cc0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
6cd0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
6ce0: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
6cf0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
6d00: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6d10: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53  pStmt);.  if( pS
6d20: 74 6d 74 20 26 26 20 0a 20 20 20 20 20 20 73 71  tmt && .      sq
6d30: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
6d40: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
6d50: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
6d60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6d70: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
6d80: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
6d90: 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  *)errorName(rc),
6da0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
6db0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
6dc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6dd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
6de0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
6df0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
6e00: 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a  pired STMT .**.*
6e10: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
6e20: 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e   a recompilation
6e30: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
6e40: 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
6e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6e60: 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20  test_expired(.  
6e70: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
6e80: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
6e90: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
6ea0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
6eb0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
6ec0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6ed0: 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  pStmt;.  if( obj
6ee0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
6ef0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6f00: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
6f10: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
6f20: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
6f30: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6f40: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
6f50: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
6f60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
6f80: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
6f90: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
6fa0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
6fb0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
6fc0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
6fd0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
6fe0: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
6ff0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69  Obj(sqlite3_expi
7000: 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  red(pStmt)));.  
7010: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7020: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
7030: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20  sqlite3_changes 
7040: 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
7050: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
7060: 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
7070: 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68  e database by th
7080: 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78  e last SQL.** ex
7090: 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ecution..*/.stat
70a0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68 61 6e  ic int test_chan
70b0: 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ges(.  void * cl
70c0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
70d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
70e0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
70f0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
7100: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
7110: 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63   *db;.  if( objc
7120: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
7130: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7140: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
7150: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
7160: 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ,.       Tcl_Get
7170: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
7180: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
7190: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
71a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
71b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
71c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
71d0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
71e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
71f0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
7200: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
7210: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
7220: 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29  e3_changes(db)))
7230: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
7240: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
7250: 20 69 73 20 74 68 65 20 22 73 74 61 74 69 63 5f   is the "static_
7260: 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74  bind_value" that
7270: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
7280: 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20  ound to when.** 
7290: 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20  the FLAG option 
72a0: 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20  of sqlite3_bind 
72b0: 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73  is "static".*/.s
72c0: 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69  tatic char *sqli
72d0: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
72e0: 61 6c 75 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  alue = 0;../*.**
72f0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
7300: 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20 20  _bind  VM  IDX  
7310: 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a  VALUE  FLAGS.**.
7320: 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c 75  ** Sets the valu
7330: 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68 20  e of the IDX-th 
7340: 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 22 3f 22  occurance of "?"
7350: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
7360: 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20   SQL.** string. 
7370: 20 56 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65   VALUE is the ne
7380: 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41  w value.  If FLA
7390: 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20  GS=="null" then 
73a0: 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f  VALUE is.** igno
73b0: 72 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  red and the valu
73c0: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
73d0: 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74  .  If FLAGS=="st
73e0: 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68  atic" then.** th
73f0: 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
7400: 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  o the value of a
7410: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
7420: 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74   named.** "sqlit
7430: 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
7440: 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d  lue".  If FLAGS=
7450: 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61  ="normal" then a
7460: 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20   copy.** of the 
7470: 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e 0a 2a  VALUE is made..*
7480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
7490: 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a  t_bind(.  void *
74a0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
74b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
74c0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
74d0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
74e0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
74f0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
7500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7510: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
7520: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
7530: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
7540: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
7550: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
7560: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
7570: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
7580: 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
7590: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
75a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
75b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
75c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
75d0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
75e0: 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49  , .       " VM I
75f0: 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73  DX VALUE (null|s
7600: 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22  tatic|normal)\""
7610: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
7620: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
7630: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
7640: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
7650: 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20  v[1], &pStmt) ) 
7660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7670: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
7680: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
7690: 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
76a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
76b0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
76c0: 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b  4],"null")==0 ){
76d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
76e0: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
76f0: 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65  t, idx);.  }else
7700: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
7710: 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30  [4],"static")==0
7720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7730: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
7740: 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74  Stmt, idx, sqlit
7750: 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
7760: 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d  lue, -1, 0);.  }
7770: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
7780: 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
7790: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
77a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
77b0: 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
77c0: 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
77d0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
77e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
77f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7800: 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65  erp, "4th argume
7810: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20  nt should be ". 
7820: 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22         "\"null\"
7830: 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f   or \"static\" o
7840: 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30  r \"normal\"", 0
7850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
7860: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
7870: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
7880: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
7890: 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
78a0: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
78b0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
78c0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
78d0: 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74  [50];.    sprint
78e0: 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
78f0: 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
7900: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7910: 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
7920: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
7930: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7940: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
7950: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
7960: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7970: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73  T_UTF16./*.** Us
7980: 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
7990: 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c  llate <db ptr> <
79a0: 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
79b0: 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20  <utf16be>.**.** 
79c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
79d0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
79e0: 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  at SQLite select
79f0: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  s the correct co
7a00: 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65  llation.** seque
7a10: 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  nce callback whe
7a20: 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
7a30: 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
7a40: 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
7a50: 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
7a60: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
7a70: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
7a80: 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63 6f  registers the co
7a90: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7aa0: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a   "test_collate".
7ab0: 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ** with database
7ac0: 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68   handle <db>. Th
7ad0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7ae0: 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74  t must be a list
7af0: 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f   of three.** boo
7b00: 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20  lean values. If 
7b10: 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75  the first is tru
7b20: 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
7b30: 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  n of test_collat
7b40: 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72  e is.** register
7b50: 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
7b60: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74   the second is t
7b70: 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
7b80: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
7b90: 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  .** UTF-16le, if
7ba0: 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74 72   the third is tr
7bb0: 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76  ue, a UTF-16be v
7bc0: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
7bd0: 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73  ble..** Previous
7be0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73   versions of tes
7bf0: 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65  t_collate are de
7c00: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
7c10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7c20: 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  nce test_collate
7c30: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
7c40: 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a  by calling the.*
7c50: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  * following TCL 
7c60: 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
7c70: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65  "test_collate <e
7c80: 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22  nc> <lhs> <rhs>"
7c90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e  .**.** The <lhs>
7ca0: 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74   and <rhs> are t
7cb0: 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65  he two values be
7cc0: 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e  ing compared, en
7cd0: 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  coded in UTF-8..
7ce0: 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72  ** The <enc> par
7cf0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 6e  ameter is the en
7d00: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f  coding of the co
7d10: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
7d20: 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20   that.** SQLite 
7d30: 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c  selected to call
7d40: 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20 73  . The TCL test s
7d50: 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73  cript implements
7d60: 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f   the.** "test_co
7d70: 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a  llate" proc..**.
7d80: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
7d90: 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b  s will only work
7da0: 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70 72   with one intepr
7db0: 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c 20  eter at a time, 
7dc0: 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70  as the.** interp
7dd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65 20   pointer to use 
7de0: 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67 20  when evaluating 
7df0: 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  the TCL script i
7e00: 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70  s stored in.** p
7e10: 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
7e20: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c  p..*/.static Tcl
7e30: 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43 6f  _Interp* pTestCo
7e40: 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74 61  llateInterp;.sta
7e50: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
7e60: 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69  late_func(.  voi
7e70: 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  d *pCtx, .  int 
7e80: 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  nA, const void *
7e90: 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f  zA,.  int nB, co
7ea0: 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a  nst void *zB.){.
7eb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20    Tcl_Interp *i 
7ec0: 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  = pTestCollateIn
7ed0: 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69  terp;.  int enci
7ee0: 6e 20 3d 20 28 69 6e 74 29 70 43 74 78 3b 0a 20  n = (int)pCtx;. 
7ef0: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 73 71 6c   int res;..  sql
7f00: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
7f10: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
7f20: 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ..  pX = Tcl_New
7f30: 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
7f40: 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20  collate", -1);. 
7f50: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
7f60: 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68  t(pX);..  switch
7f70: 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63  ( encin ){.    c
7f80: 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a  ase SQLITE_UTF8:
7f90: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
7fa0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7fb0: 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
7fc0: 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31  ngObj("UTF-8",-1
7fd0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
7fe0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7ff0: 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20  _UTF16LE:.      
8000: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8010: 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
8020: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
8030: 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a  UTF-16LE",-1));.
8040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
8060: 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f  16BE:.      Tcl_
8070: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8080: 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65  ment(i,pX,Tcl_Ne
8090: 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
80a0: 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20  16BE",-1));.    
80b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
80c0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
80d0: 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 56  rt(0);.  }..  pV
80e0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
80f0: 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65  eNew();.  sqlite
8100: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
8110: 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e  l, nA, zA, encin
8120: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8130: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
8140: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
8150: 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
8160: 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  bj(sqlite3_value
8170: 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 29 29  _text(pVal),-1))
8180: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
8190: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c  SetStr(pVal, nB,
81a0: 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zB, encin, SQLI
81b0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 54 63  TE_STATIC);.  Tc
81c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
81d0: 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
81e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
81f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8200: 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20 20 73 71  pVal),-1));.  sq
8210: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
8220: 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45 76 61  Val);..  Tcl_Eva
8230: 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30 29  lObjEx(i, pX, 0)
8240: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
8250: 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
8260: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c  GetIntFromObj(i,
8270: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
8280: 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20 72  t(i), &res);.  r
8290: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61  eturn res;.}.sta
82a0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
82b0: 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  late(.  void * c
82c0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
82d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
82e0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
82f0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
8300: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
8310: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c  3 *db;.  int val
8320: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
8330: 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
8340: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
8350: 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
8360: 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61 74  s;.  pTestCollat
8370: 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  eInterp = interp
8380: 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
8390: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
83a0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
83b0: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
83c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
83d0: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
83e0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
83f0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
8400: 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
8410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8420: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
8430: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
8440: 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
8450: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
8460: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20            (void 
8470: 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 76  *)SQLITE_UTF8, v
8480: 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
8490: 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20 72  func:0);.  if( r
84a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
84b0: 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
84c0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
84d0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
84e0: 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
84f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8500: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8510: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
8520: 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c  on(db, "test_col
8530: 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
8540: 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
8550: 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
8560: 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f  TE_UTF16LE, val?
8570: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
8580: 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43  c:0);.    if( TC
8590: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
85a0: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
85b0: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61  rp, objv[4], &va
85c0: 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
85d0: 45 52 52 4f 52 3b 0a 0a 20 20 20 20 70 56 61 6c  ERROR;..    pVal
85e0: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
85f0: 65 77 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ew();.    sqlite
8600: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
8610: 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c  l, -1, "test_col
8620: 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
8630: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
8640: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
8650: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
8660: 31 36 28 64 62 2c 20 73 71 6c 69 74 65 33 56 61  16(db, sqlite3Va
8670: 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
8680: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
8690: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  ), .          SQ
86a0: 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 28 76  LITE_UTF16BE, (v
86b0: 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
86c0: 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63  16BE, val?test_c
86d0: 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
86e0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
86f0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a  Free(pVal);.  }.
8700: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
8710: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
8720: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
8730: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
8740: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
8750: 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
8760: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8770: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8780: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8790: 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
87a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
87b0: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
87c0: 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
87d0: 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
87e0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
87f0: 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RROR;.}..static 
8800: 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74  void test_collat
8810: 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76  e_needed_cb(.  v
8820: 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71  oid *pCtx, .  sq
8830: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
8840: 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e   eTextRep,.  con
8850: 73 74 20 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64  st void *notUsed
8860: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20  .){.  int enc = 
8870: 64 62 2d 3e 65 6e 63 3b 0a 20 20 73 71 6c 69 74  db->enc;.  sqlit
8880: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
8890: 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ion(.      db, "
88a0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 64  test_collate", d
88b0: 62 2d 3e 65 6e 63 2c 20 28 76 6f 69 64 20 2a 29  b->enc, (void *)
88c0: 65 6e 63 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74  enc, test_collat
88d0: 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e_func);.}../*.*
88e0: 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
88f0: 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
8900: 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   DB.*/.static in
8910: 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  t test_collate_n
8920: 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 20  eeded(.  void * 
8930: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
8940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8950: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
8960: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
8970: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
8980: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
8990: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
89a0: 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73   ) goto bad_args
89b0: 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
89c0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
89d0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
89e0: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
89f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8a00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rc = sqlite3_col
8a10: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
8a20: 64 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c  db, 0, test_coll
8a30: 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a  ate_needed_cb);.
8a40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
8a50: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
8a60: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
8a70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
8a80: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
8a90: 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57  ad_args:.  Tcl_W
8aa0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8ab0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
8ac0: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ");.  return TCL
8ad0: 5f 45 52 52 4f 52 3b 0a 7d 0a 23 65 6e 64 69 66  _ERROR;.}.#endif
8ae0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8af0: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
8b00: 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
8b10: 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72  function <db ptr
8b20: 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
8b30: 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a  e> <utf16be>.**.
8b40: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8b50: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
8b60: 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c   that SQLite sel
8b70: 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74  ects the correct
8b80: 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f   user.** functio
8b90: 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20  n callback when 
8ba0: 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e  multiple version
8bb0: 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74  s (for different
8bc0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29   text encodings)
8bd0: 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c  .** are availabl
8be0: 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  e..**.** Calling
8bf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
8c00: 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74 68  gisters up to th
8c10: 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
8c20: 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
8c30: 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74  n.** "test_funct
8c40: 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62 61  ion" with databa
8c50: 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20  se handle <db>. 
8c60: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
8c70: 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72  rgument is.** tr
8c80: 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
8c90: 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74  on of test_funct
8ca0: 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65  ion is registere
8cb0: 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20  d for UTF-8, if 
8cc0: 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20  the.** third is 
8cd0: 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
8ce0: 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
8cf0: 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74  r UTF-16le, if t
8d00: 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20  he fourth is.** 
8d10: 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65  true, a UTF-16be
8d20: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
8d30: 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73  lable.  Previous
8d40: 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20   versions of.** 
8d50: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72  test_function ar
8d60: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
8d70: 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   The user functi
8d80: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
8d90: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  d by calling the
8da0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73   following TCL s
8db0: 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  cript:.**.**   "
8dc0: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65  test_function <e
8dd0: 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a  nc> <arg>".**.**
8de0: 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20   Where <enc> is 
8df0: 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54  one of UTF-8, UT
8e00: 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42  F-16LE or UTF16B
8e10: 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20  E, and <arg> is 
8e20: 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72  the.** single ar
8e30: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
8e40: 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
8e50: 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  n. The value ret
8e60: 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  urned by.** the 
8e70: 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75 73  TCL script is us
8e80: 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72 6e  ed as the return
8e90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51   value of the SQ
8ea0: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a  L function. It.*
8eb0: 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 53  * is passed to S
8ec0: 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d  QLite using UTF-
8ed0: 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38  16BE for a UTF-8
8ee0: 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
8ef0: 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61  , UTF-8.** for a
8f00: 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66   UTF-16LE test_f
8f10: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55  unction(), and U
8f20: 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69  TF-16LE for an i
8f30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
8f40: 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54  at.** prefers UT
8f50: 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64  F-16BE..*/.#ifnd
8f60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
8f70: 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64  TF16.static void
8f80: 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
8f90: 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tf8(.  sqlite3_c
8fa0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
8fb0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
8fc0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
8fd0: 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
8fe0: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
8ff0: 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
9000: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
9010: 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
9020: 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
9030: 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
9040: 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
9050: 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
9060: 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
9070: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
9080: 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
9090: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
90a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
90b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
90c0: 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a  ("UTF-8", -1));.
90d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
90e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
90f0: 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
9100: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
9110: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9120: 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
9130: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
9140: 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
9150: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
9160: 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69  ount(pX);.  sqli
9170: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
9180: 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72  pCtx, Tcl_GetStr
9190: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
91a0: 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ), -1, SQLITE_TR
91b0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c  ANSIENT);.  pVal
91c0: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
91d0: 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ew();.  sqlite3V
91e0: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
91f0: 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
9200: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
9210: 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
9220: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
9230: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
9240: 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28  result_text16be(
9250: 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
9260: 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61  lue_text16be(pVa
9270: 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
9280: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
9290: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
92a0: 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61  ree(pVal);.}.sta
92b0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75  tic void test_fu
92c0: 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a  nction_utf16le(.
92d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
92e0: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
92f0: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
9300: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
9310: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9320: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
9330: 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *pX;.  sqlite3_v
9340: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
9350: 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65  terp = (Tcl_Inte
9360: 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rp *)sqlite3_use
9370: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
9380: 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
9390: 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63  ngObj("test_func
93a0: 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63  tion", -1);.  Tc
93b0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
93c0: 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  X);.  Tcl_ListOb
93d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
93e0: 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e  nterp, pX, Tcl_N
93f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
9400: 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20  -16LE", -1));.  
9410: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
9420: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
9430: 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
9440: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
9450: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9460: 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
9470: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
9480: 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
9490: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
94a0: 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d  nt(pX);.  pVal =
94b0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
94c0: 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  ();.  sqlite3Val
94d0: 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
94e0: 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  1, Tcl_GetString
94f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
9500: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
9510: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
9520: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  C);.  sqlite3_re
9530: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 73  sult_text(pCtx,s
9540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9550: 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54  t(pVal),-1,SQLIT
9560: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
9570: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
9580: 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  (pVal);.}.static
9590: 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74   void test_funct
95a0: 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73  ion_utf16be(.  s
95b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
95c0: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
95d0: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
95e0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
95f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9600: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
9610: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
9620: 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
9630: 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
9640: 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
9650: 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
9660: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
9670: 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
9680: 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
9690: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
96a0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
96b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
96c0: 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
96d0: 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
96e0: 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  BE", -1));.  Tcl
96f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
9700: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
9710: 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
9720: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
9730: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9740: 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
9750: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
9760: 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
9770: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
9780: 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
9790: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b  lite3ValueNew();
97a0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
97b0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
97c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
97d0: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20  ult(interp), .  
97e0: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
97f0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
9800: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
9810: 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c  t_text16le(pCtx,
9820: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
9830: 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20  ext16le(pVal),. 
9840: 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
9850: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
9860: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
9870: 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Val);.}.#endif /
9880: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
9890: 46 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  F16 */.static in
98a0: 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  t test_function(
98b0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
98c0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
98d0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
98e0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
98f0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
9900: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9910: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
9920: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
9930: 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62  t val;..  if( ob
9940: 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64  jc!=5 ) goto bad
9950: 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74  _args;.  if( get
9960: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
9970: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
9980: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
9990: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
99a0: 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  R;..  if( TCL_OK
99b0: 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
99c0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
99d0: 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29  objv[2], &val) )
99e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
99f0: 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
9a00: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
9a10: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
9a20: 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
9a30: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
9a40: 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70   .        interp
9a50: 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  , test_function_
9a60: 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  utf8, 0, 0);.  }
9a70: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
9a80: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
9a90: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
9aa0: 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
9ab0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9ac0: 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20    if( val ){.   
9ad0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
9ae0: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65  function(db, "te
9af0: 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c  st_function", 1,
9b00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
9b10: 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70   .        interp
9b20: 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  , test_function_
9b30: 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a  utf16le, 0, 0);.
9b40: 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b    }.  if( TCL_OK
9b50: 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
9b60: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
9b70: 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29  objv[4], &val) )
9b80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9b90: 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
9bb0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
9bc0: 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
9bd0: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
9be0: 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  BE, .        int
9bf0: 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
9c00: 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c 20 30  on_utf16be, 0, 0
9c10: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
9c20: 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67   TCL_OK;.bad_arg
9c30: 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
9c40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9c50: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9c60: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
9c70: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
9c80: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
9c90: 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
9ca0: 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
9cb0: 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e 64  16be>", 0);.#end
9cc0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9cd0: 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
9ce0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
9cf0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9d00: 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 73         test_errs
9d10: 74 72 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a  tr <err code>.**
9d20: 0a 2a 2a 20 54 65 73 74 20 74 68 61 74 20 74 68  .** Test that th
9d30: 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e english langua
9d40: 67 65 20 73 74 72 69 6e 67 20 65 71 75 69 76 61  ge string equiva
9d50: 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c 69 74 65  lents for sqlite
9d60: 20 65 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20   error codes.** 
9d70: 61 72 65 20 73 61 6e 65 2e 20 54 68 65 20 70 61  are sane. The pa
9d80: 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 69 6e  rameter is an in
9d90: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 69  teger representi
9da0: 6e 67 20 61 6e 20 73 71 6c 69 74 65 20 65 72 72  ng an sqlite err
9db0: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20  or code..** The 
9dc0: 72 65 73 75 6c 74 20 69 73 20 61 20 6c 69 73 74  result is a list
9dd0: 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   of two elements
9de0: 2c 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  , the string rep
9df0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
9e00: 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  he.** error code
9e10: 20 61 6e 64 20 74 68 65 20 65 6e 67 6c 69 73 68   and the english
9e20: 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
9e30: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
9e40: 20 69 6e 74 20 74 65 73 74 5f 65 72 72 73 74 72   int test_errstr
9e50: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
9e60: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
9e70: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
9e80: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
9e90: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
9ea0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64  .){.  char *zCod
9eb0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  e;.  int i;.  if
9ec0: 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
9ed0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
9ee0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
9ef0: 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e  v, "<error code>
9f00: 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65  ");.  }..  zCode
9f10: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9f20: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72  (objv[1]);.  for
9f30: 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b  (i=0; i<200; i++
9f40: 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  ){.    if( 0==st
9f50: 72 63 6d 70 28 65 72 72 6f 72 4e 61 6d 65 28 69  rcmp(errorName(i
9f60: 29 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61  ), zCode) ) brea
9f70: 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  k;.  }.  Tcl_Set
9f80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
9f90: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
9fa0: 72 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72  rStr(i), 0);.  r
9fb0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9fd0: 74 65 33 5f 63 72 61 73 68 70 61 72 61 6d 73 28  te3_crashparams(
9fe0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
9ff0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
a000: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
a010: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
a020: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
a030: 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53  ){.#ifdef OS_TES
a040: 54 0a 20 20 69 6e 74 20 64 65 6c 61 79 3b 0a 20  T.  int delay;. 
a050: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 20 67   if( objc!=3 ) g
a060: 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
a070: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
a080: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
a090: 6a 76 5b 31 5d 2c 20 26 64 65 6c 61 79 29 20 29  jv[1], &delay) )
a0a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a0b0: 52 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 43  R;.  sqlite3SetC
a0c0: 72 61 73 68 50 61 72 61 6d 73 28 64 65 6c 61 79  rashParams(delay
a0d0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
a0e0: 6f 62 6a 76 5b 32 5d 29 29 3b 0a 23 65 6e 64 69  objv[2]));.#endi
a0f0: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
a100: 4b 3b 0a 0a 23 69 66 64 65 66 20 4f 53 5f 54 45  K;..#ifdef OS_TE
a110: 53 54 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ST.bad_args:.  T
a120: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a130: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a140: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a150: 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
a160: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a170: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 3c  (objv[0], 0), "<
a180: 64 65 6c 61 79 3e 20 3c 66 69 6c 65 6e 61 6d 65  delay> <filename
a190: 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  >", 0);.  return
a1a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64   TCL_ERROR;.#end
a1b0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  if.}.../*.** Usa
a1c0: 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e  ge:    breakpoin
a1d0: 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  t.**.** This rou
a1e0: 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20  tine exists for 
a1f0: 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f  one purpose - to
a200: 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65   provide a place
a210: 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65   to put a.** bre
a220: 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42  akpoint with GDB
a230: 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69   that can be tri
a240: 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c  ggered using TCL
a250: 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a   code.  The use.
a260: 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77  ** for this is w
a270: 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72  hen a particular
a280: 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28   test fails on (
a290: 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20  say) the 1485th 
a2a0: 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e  iteration..** In
a2b0: 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   the TCL test sc
a2c0: 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64  ript, we can add
a2d0: 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a   code like this:
a2e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24  .**.**     if {$
a2f0: 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f  i==1485} breakpo
a300: 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72  int.**.** Then r
a310: 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69  un testfixture i
a320: 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61  n the debugger a
a330: 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20  nd wait for the 
a340: 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a  breakpoint to.**
a350: 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64   fire.  Then add
a360: 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69  itional breakpoi
a370: 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74  nts can be set t
a380: 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65  o trace down the
a390: 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   bug..*/.static 
a3a0: 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  int test_breakpo
a3b0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
a3c0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a3d0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a3e0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a3f0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a400: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a410: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a430: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a440: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a450: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a460: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a470: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a480: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
a490: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
a4a0: 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
a4b0: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
a4c0: 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54  3_bind_int  STMT
a4d0: 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
a4e0: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
a4f0: 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66 61  bind_int interfa
a500: 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
a510: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a520: 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
a530: 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
a540: 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
a550: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
a560: 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
a570: 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69 6e  inds a 32-bit in
a580: 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
a590: 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
a5a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
a5b0: 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69  _bind_int(.  voi
a5c0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
a5d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a5e0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
a5f0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
a600: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
a610: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
a620: 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
a630: 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e   int value;.  in
a640: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
a650: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
a660: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a670: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
a680: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a690: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
a6a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a6b0: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
a6c0: 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
a6d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a6e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
a6f0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
a700: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
a710: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
a720: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
a730: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a740: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
a750: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
a760: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
a770: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a780: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
a790: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a7a0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
a7b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a7c0: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
a7d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
a7e0: 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
a7f0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
a800: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
a810: 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
a820: 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
a830: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
a840: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a850: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
a860: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
a870: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a880: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
a890: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
a8a0: 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56 41  int64  STMT N VA
a8b0: 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
a8c0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
a8d0: 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65 2e  int64 interface.
a8e0: 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
a8f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
a900: 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
a910: 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
a920: 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
a930: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
a940: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
a950: 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
a960: 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
a970: 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
a980: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
a990: 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  nd_int64(.  void
a9a0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
a9b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
a9c0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
a9d0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
a9e0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
a9f0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
aa00: 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
aa10: 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  i64 value;.  int
aa20: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
aa30: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
aa40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
aa50: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
aa60: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
aa70: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
aa80: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
aa90: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
aaa0: 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
aab0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aac0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
aad0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
aae0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
aaf0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
ab00: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
ab10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ab20: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
ab30: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
ab40: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
ab50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab60: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
ab70: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
ab80: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
ab90: 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
aba0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
abb0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
abc0: 74 36 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  t64(pStmt, idx, 
abd0: 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
abe0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
abf0: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
ac00: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
ac10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ac20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ac30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
ac40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ac50: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
ac60: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
ac70: 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
ac80: 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d  bind_double  STM
ac90: 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
aca0: 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
acb0: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74  _bind_double int
acc0: 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
acd0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
ace0: 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
acf0: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
ad00: 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
ad10: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
ad20: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
ad30: 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69  ** binds a 64-bi
ad40: 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20  t integer VALUE 
ad50: 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64  to that wildcard
ad60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ad70: 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  test_bind_double
ad80: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
ad90: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
ada0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
adb0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
adc0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
add0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
ade0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
adf0: 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20 76   idx;.  double v
ae00: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
ae10: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
ae20: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
ae30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ae40: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
ae50: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
ae60: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
ae70: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
ae80: 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
ae90: 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
aea0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
aeb0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
aec0: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
aed0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
aee0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
aef0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
af00: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
af10: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
af20: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
af30: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
af40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
af50: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
af60: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
af70: 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
af80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
af90: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
afa0: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
afb0: 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
afc0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
afd0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
afe0: 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
aff0: 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
b000: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
b010: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b020: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
b030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b040: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
b050: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
b060: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
b070: 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a  ull  STMT N.**.*
b080: 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
b090: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74  e3_bind_null int
b0a0: 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
b0b0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
b0c0: 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
b0d0: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
b0e0: 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
b0f0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
b100: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
b110: 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20  ** binds a NULL 
b120: 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
b130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b140: 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20  est_bind_null(. 
b150: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
b160: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
b170: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
b180: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
b190: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
b1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
b1b0: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
b1c0: 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  x;.  int rc;..  
b1d0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
b1e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b1f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
b200: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
b210: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
b220: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
b230: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
b240: 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20 30  0), " STMT N", 0
b250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b260: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b270: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
b280: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
b290: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b2a0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
b2b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b2c0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
b2d0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
b2e0: 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
b2f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b300: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
b310: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
b320: 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 73  t, idx);.  if( s
b330: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
b340: 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
b350: 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
b360: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b370: 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
b380: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
b390: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b3a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
b3b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
b3c0: 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
b3d0: 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20  bind_text  STMT 
b3e0: 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a  N STRING BYTES.*
b3f0: 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
b400: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
b410: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
b420: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
b430: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
b440: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
b450: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
b460: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
b470: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
b480: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54  nd.** binds a UT
b490: 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e  F-8 string STRIN
b4a0: 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
b4b0: 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
b4c0: 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
b4d0: 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
b4e0: 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74   int test_bind_t
b4f0: 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ext(.  void * cl
b500: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
b510: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
b520: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
b530: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b540: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
b550: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
b560: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
b570: 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
b580: 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
b590: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
b5a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b5b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
b5c0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
b5d0: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
b5e0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
b5f0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
b600: 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
b610: 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b  ALUE BYTES", 0);
b620: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b630: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
b640: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
b650: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b660: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b670: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
b680: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
b690: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
b6a0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
b6b0: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
b6c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b6d0: 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65    value = Tcl_Ge
b6e0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
b6f0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
b700: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
b710: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65  , objv[4], &byte
b720: 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
b730: 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
b740: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
b750: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
b760: 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54  ue, bytes, SQLIT
b770: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
b780: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
b790: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
b7a0: 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
b7b0: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
b7c0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
b7d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b7e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b7f0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
b800: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
b810: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
b820: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
b830: 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20    STMT N STRING 
b840: 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
b850: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
b860: 64 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61  d_text16 interfa
b870: 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
b880: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
b890: 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
b8a0: 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
b8b0: 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
b8c0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
b8d0: 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
b8e0: 69 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74  inds a UTF-16 st
b8f0: 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74  ring STRING to t
b900: 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
b910: 65 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45  e string is BYTE
b920: 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e  S bytes.** long.
b930: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b940: 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  est_bind_text16(
b950: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
b960: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
b970: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
b980: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
b990: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
b9a0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
b9b0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
b9c0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
b9d0: 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
b9e0: 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
b9f0: 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
ba00: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
ba10: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
ba20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ba30: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
ba40: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
ba50: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
ba60: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
ba70: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
ba80: 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
ba90: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
baa0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
bab0: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
bac0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
bad0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
bae0: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
baf0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bb00: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
bb10: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
bb20: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
bb30: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
bb40: 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
bb50: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
bb60: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
bb70: 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47   0);.  if( Tcl_G
bb80: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
bb90: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62  erp, objv[4], &b
bba0: 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
bbb0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
bbc0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
bbd0: 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78  ext16(pStmt, idx
bbe0: 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c  , (void *)value,
bbf0: 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54   bytes, SQLITE_T
bc00: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28  RANSIENT);.  if(
bc10: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
bc20: 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
bc30: 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
bc40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
bc50: 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
bc60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bc70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bc80: 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.  }..#endif /*
bc90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
bca0: 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
bcb0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
bcc0: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
bcd0: 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 53 54 4d 54  _bind_blob  STMT
bce0: 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a   N DATA BYTES.**
bcf0: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
bd00: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69  ite3_bind_blob i
bd10: 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
bd20: 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
bd30: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
bd40: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
bd50: 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
bd60: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
bd70: 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
bd80: 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f  d.** binds a BLO
bd90: 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
bda0: 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20  d.  The BLOB is 
bdb0: 42 59 54 45 53 20 62 79 74 65 73 20 69 6e 20 73  BYTES bytes in s
bdc0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
bdd0: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f  nt test_bind_blo
bde0: 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  b(.  void * clie
bdf0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
be00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
be10: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
be20: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
be30: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
be40: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
be50: 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
be60: 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
be70: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
be80: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
be90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
bea0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
beb0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
bec0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
bed0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
bee0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
bef0: 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54  0), " STMT N DAT
bf00: 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  A BYTES", 0);.  
bf10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
bf20: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
bf30: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
bf40: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
bf50: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
bf60: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
bf70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
bf80: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
bf90: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
bfa0: 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
bfb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76  n TCL_ERROR;.  v
bfc0: 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  alue = Tcl_GetSt
bfd0: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
bfe0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
bff0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
c000: 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20  bjv[4], &bytes) 
c010: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c020: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
c030: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
c040: 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c  tmt, idx, value,
c050: 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54   bytes, SQLITE_T
c060: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28  RANSIENT);.  if(
c070: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
c080: 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
c090: 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
c0a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
c0b0: 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
c0c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c0d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c0e0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
c0f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
c100: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
c110: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
c120: 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a  _count  STMT.**.
c130: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
c140: 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64  mber of wildcard
c150: 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73  s in the given s
c160: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
c170: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
c180: 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
c190: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
c1a0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
c1b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
c1c0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
c1d0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c1e0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
c1f0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
c200: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
c210: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c220: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c230: 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
c240: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c250: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
c260: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
c270: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
c280: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
c290: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
c2a0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
c2b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c2c0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
c2d0: 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
c2e0: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
c2f0: 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
c300: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
c310: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
c320: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
c330: 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a  r_name  STMT  N.
c340: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
c350: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68   name of the Nth
c360: 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
c370: 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69  first wildcard i
c380: 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79  s 1..** An empty
c390: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
c3a0: 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20  ned if N is out 
c3b0: 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74  of range or if t
c3c0: 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69  he wildcard.** i
c3d0: 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73  s nameless..*/.s
c3e0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
c3f0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
c400: 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
c410: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
c420: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
c430: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
c440: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
c450: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
c460: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
c470: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  nt i;..  if( obj
c480: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
c490: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c4a0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
c4b0: 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  TMT N");.    ret
c4c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c4d0: 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
c4e0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
c4f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c500: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
c510: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c520: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
c530: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
c540: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29  rp, objv[2], &i)
c550: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
c560: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
c570: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c580: 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  .     Tcl_NewStr
c590: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62  ingObj(sqlite3_b
c5a0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
c5b0: 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a  me(pStmt,i),-1).
c5c0: 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
c5d0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
c5e0: 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
c5f0: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
c600: 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45  ndex  STMT  NAME
c610: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
c620: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77  e index of the w
c630: 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e  ildcard called N
c640: 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69  AME.  Return 0 i
c650: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
c660: 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a   such wildcard..
c670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
c680: 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
c690: 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20  r_index(.  void 
c6a0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
c6b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c6c0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
c6d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
c6e0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
c6f0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
c700: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
c710: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
c720: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c730: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
c740: 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
c750: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c760: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
c770: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
c780: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
c790: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
c7a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c7b0: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
c7c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
c7d0: 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62      Tcl_NewIntOb
c7e0: 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  j(.       sqlite
c7f0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
c800: 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c  _index(pStmt,Tcl
c810: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c820: 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b  2])).     ).  );
c830: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
c840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
c850: 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
c860: 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a  r_bindings STMT.
c870: 2a 2a 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74  **.*/.#if 0.stat
c880: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61  ic int test_clea
c890: 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76 6f  r_bindings(.  vo
c8a0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
c8b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c8c0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
c8d0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
c8e0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
c8f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
c900: 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
c910: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
c920: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
c930: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
c940: 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
c950: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c960: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
c970: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
c980: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c990: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
c9a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c9b0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
c9c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
c9d0: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
c9e0: 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  3_clear_bindings
c9f0: 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
ca00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
ca10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ndif../*.** Usag
ca20: 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  e: sqlite3_errco
ca30: 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  de DB.**.** Retu
ca40: 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  rn the string re
ca50: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
ca60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
ca70: 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a  sqlite3_* API.**
ca80: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67   error code. e.g
ca90: 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  . "SQLITE_ERROR"
caa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cab0: 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20 20  test_errcode(.  
cac0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
cad0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
cae0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
caf0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
cb00: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
cb10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
cb20: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
cb30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
cb40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
cb50: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
cb60: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
cb70: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
cb80: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
cb90: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
cba0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cbb0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
cbc0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
cbd0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
cbe0: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
cbf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
cc00: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
cc10: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72  erp, (char *)err
cc20: 6f 72 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 65  orName(sqlite3_e
cc30: 72 72 63 6f 64 65 28 64 62 29 29 2c 20 30 29 3b  rrcode(db)), 0);
cc40: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
cc50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
cc60: 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20  :   test_errmsg 
cc70: 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
cc80: 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65   the UTF-8 repre
cc90: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
cca0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
ccb0: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
ccc0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
ccd0: 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
cce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
ccf0: 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f  est_errmsg(.  vo
cd00: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
cd10: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cd20: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
cd30: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
cd40: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
cd50: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
cd60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
cd70: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
cd80: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
cd90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cda0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
cdb0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
cdc0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
cdd0: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
cde0: 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
cdf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ce00: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
ce10: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
ce20: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
ce30: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
ce40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
ce50: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
ce60: 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54  _errmsg(db);.  T
ce70: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ce80: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
ce90: 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d  tringObj(zErr, -
cea0: 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
ceb0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
cec0: 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72  sage:   test_err
ced0: 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52  msg16 DB.**.** R
cee0: 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31  eturns the UTF-1
cef0: 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  6 representation
cf00: 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
cf10: 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
cf20: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
cf30: 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
cf40: 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20  I call. This is 
cf50: 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a  a byte array obj
cf60: 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a  ect at the TCL .
cf70: 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74  ** level, and it
cf80: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78   includes the 0x
cf90: 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  00 0x00 terminat
cfa0: 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20  or bytes at the 
cfb0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54  end of the.** UT
cfc0: 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  F-16 string..*/.
cfd0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
cfe0: 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64  errmsg16(.  void
cff0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
d000: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d010: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
d020: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
d030: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
d040: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d050: 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
d060: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
d070: 64 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 62  d *zErr;.  int b
d080: 79 74 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  ytes;..  if( obj
d090: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
d0a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d0b0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
d0c0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
d0d0: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
d0e0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
d0f0: 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
d100: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d110: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
d120: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
d130: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
d140: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
d150: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d160: 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71  OR;..  zErr = sq
d170: 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64  lite3_errmsg16(d
d180: 62 29 3b 0a 20 20 62 79 74 65 73 20 3d 20 73 71  b);.  bytes = sq
d190: 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c 65  lite3utf16ByteLe
d1a0: 6e 28 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 54  n(zErr, -1);.  T
d1b0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
d1c0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
d1d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
d1e0: 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
d1f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d200: 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
d210: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
d220: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
d230: 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
d240: 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
d250: 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
d260: 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
d270: 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
d280: 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
d290: 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
d2a0: 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
d2b0: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
d2c0: 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
d2d0: 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
d2e0: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
d2f0: 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
d300: 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
d310: 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
d320: 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
d330: 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
d340: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
d350: 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76  est_prepare(.  v
d360: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
d370: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
d380: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
d390: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
d3a0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
d3b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d3c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
d3d0: 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
d3e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
d3f0: 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
d400: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
d410: 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
d420: 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
d430: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
d440: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d450: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
d460: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
d470: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
d480: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
d490: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
d4a0: 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
d4b0: 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
d4c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d4d0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
d4e0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
d4f0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d500: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
d510: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d520: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
d530: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
d540: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
d550: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
d560: 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
d570: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d580: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
d590: 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
d5a0: 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
d5b0: 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
d5c0: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
d5d0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
d5e0: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
d5f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
d600: 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 69 66   zTail ){.    if
d610: 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
d620: 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
d630: 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  s - (zTail-zSql)
d640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
d650: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
d660: 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54  p, objv[4], 0, T
d670: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
d680: 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
d690: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
d6a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d6b0: 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
d6c0: 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
d6d0: 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
d6e0: 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
d6f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d700: 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
d710: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
d720: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d730: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
d740: 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
d750: 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74  f( makePointerSt
d760: 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
d770: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
d780: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
d790: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d7a0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
d7b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
d7c0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
d7d0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
d7e0: 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62 79  repare DB sql by
d7f0: 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a  tes tailvar.**.*
d800: 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
d810: 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
d820: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
d830: 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
d840: 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
d850: 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
d860: 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
d870: 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
d880: 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
d890: 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
d8a0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
d8b0: 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
d8c0: 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
d8d0: 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
d8e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d8f0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d900: 70 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69  prepare16(.  voi
d910: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
d920: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d930: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
d940: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
d950: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
d960: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d970: 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
d980: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
d990: 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73  id *zSql;.  cons
d9a0: 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20  t void *zTail = 
d9b0: 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54  0;.  Tcl_Obj *pT
d9c0: 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
d9d0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
d9e0: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
d9f0: 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a  50]; .  int rc;.
da00: 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
da10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
da20: 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
da30: 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
da40: 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da60: 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
da70: 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
da80: 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
da90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
daa0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dab0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
dac0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
dad0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
dae0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
daf0: 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
db00: 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
db10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
db20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
db30: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
db40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
db50: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
db60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
db70: 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
db80: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
db90: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
dba0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
dbb0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
dbc0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
dbd0: 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
dbe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
dbf0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
dc00: 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62  re16(db, zSql, b
dc10: 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a  ytes, &pStmt, &z
dc20: 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  Tail);.  if( sql
dc30: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
dc40: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
dc50: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
dc60: 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
dc70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dc80: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
dc90: 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f 62   zTail ){.    ob
dca0: 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
dcb0: 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
dcc0: 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73   *)zSql);.  }els
dcd0: 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  e{.    objlen = 
dce0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20 3d  0;.  }.  pTail =
dcf0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
dd00: 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c  yObj((u8 *)zTail
dd10: 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c  , objlen);.  Tcl
dd20: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _IncrRefCount(pT
dd30: 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53  ail);.  Tcl_ObjS
dd40: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
dd50: 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
dd60: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
dd70: 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
dd80: 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
dd90: 0a 20 20 20 20 69 66 28 20 6d 61 6b 65 50 6f 69  .    if( makePoi
dda0: 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
ddb0: 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
ddc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ddd0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
dde0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ddf0: 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66  zBuf, 0);.#endif
de00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
de10: 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
de20: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
de30: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
de40: 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20  3_open filename 
de50: 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a  ?options-list?.*
de60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
de70: 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a  t_open(.  void *
de80: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
de90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
dea0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
deb0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
dec0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73  objv[].){.  cons
ded0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
dee0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
def0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
df00: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
df10: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
df20: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
df30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
df40: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
df50: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
df60: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
df70: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
df80: 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
df90: 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20   options-list", 
dfa0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
dfb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
dfc0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
dfd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
dfe0: 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  1]);.  rc = sqli
dff0: 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  te3_open(zFilena
e000: 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69  me, &db);.  .  i
e010: 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74  f( makePointerSt
e020: 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
e030: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
e040: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
e050: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e060: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
e070: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
e080: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
e090: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c  lite3_open16 fil
e0a0: 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f  ename options.*/
e0b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
e0c0: 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20  _open16(.  void 
e0d0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e0e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e0f0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e100: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e110: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
e120: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
e130: 54 46 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69  TF16.  const voi
e140: 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  d *zFilename;.  
e150: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
e160: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42  nt rc;.  char zB
e170: 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
e180: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
e190: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e1a0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
e1b0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
e1c0: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
e1d0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e1e0: 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
e1f0: 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20   options-list", 
e200: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e210: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
e220: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
e230: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
e240: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
e250: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e260: 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d  _open16(zFilenam
e270: 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66  e, &db);.  .  if
e280: 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  ( makePointerStr
e290: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
e2a0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
e2b0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
e2c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e2d0: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
e2e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e2f0: 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
e300: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
e310: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
e320: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c  te3_complete16 <
e330: 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a  UTF-16 string>.*
e340: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
e350: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72   the supplied ar
e360: 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70  gument is a comp
e370: 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
e380: 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f  nt, or zero.** o
e390: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
e3a0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d  tic int test_com
e3b0: 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20  plete16(.  void 
e3c0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e3d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e3e0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e3f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e400: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
e410: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
e420: 54 46 31 36 0a 20 20 63 68 61 72 20 2a 7a 42 75  TF16.  char *zBu
e430: 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  f;..  if( objc!=
e440: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
e450: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
e460: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66  , 1, objv, "<utf
e470: 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20  -16 sql>");.    
e480: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e490: 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20  ;.  }..  zBuf = 
e4a0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
e4b0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
e4c0: 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62   0);.  Tcl_SetOb
e4d0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
e4e0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
e4f0: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
e500: 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66  (zBuf)));.#endif
e510: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e520: 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  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 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a  3_step STMT.**.*
e560: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74  * Advance the st
e570: 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e  atement to the n
e580: 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ext row..*/.stat
e590: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70  ic int test_step
e5a0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
e5b0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
e5c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
e5d0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
e5e0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
e5f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
e600: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
e610: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
e620: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
e630: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e640: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
e650: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
e660: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
e670: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
e680: 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
e690: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e6a0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
e6b0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
e6c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
e6d0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
e6e0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
e6f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
e700: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
e710: 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28  Stmt);..  /* if(
e720: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
e730: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52   && rc!=SQLITE_R
e740: 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  OW ) return TCL_
e750: 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f  ERROR; */.  Tcl_
e760: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
e770: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
e780: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
e790: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
e7a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
e7b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
e7c0: 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  nt STMT .**.** R
e7d0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
e7e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
e7f0: 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20  rned by the sql 
e800: 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a  statement STMT..
e810: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
e820: 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  st_column_count(
e830: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
e840: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
e850: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
e860: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
e870: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
e880: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
e890: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
e8a0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
e8b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e8c0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
e8d0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
e8e0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
e8f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e900: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
e910: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
e920: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e930: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
e940: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
e950: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
e960: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
e970: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
e980: 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
e990: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e9a0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
e9b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
e9c0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
e9d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
e9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
e9f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ea00: 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
ea10: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
ea20: 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64 61  e type of the da
ea30: 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
ea40: 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
ea50: 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  rent row..*/.sta
ea60: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
ea70: 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  umn_type(.  void
ea80: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
ea90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
eaa0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
eab0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
eac0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
ead0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
eae0: 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
eaf0: 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f  int tp;..  if( o
eb00: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
eb10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
eb20: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
eb30: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
eb40: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
eb50: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
eb60: 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
eb70: 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
eb80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eb90: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
eba0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
ebb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
ebc0: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
ebd0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ebe0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
ebf0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
ec00: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
ec10: 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
ec20: 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20  _ERROR;..  tp = 
ec30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
ec40: 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ype(pStmt, col);
ec50: 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29 7b  .  switch( tp ){
ec60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
ec70: 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20  _INTEGER: .     
ec80: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ec90: 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22  nterp, "INTEGER"
eca0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
ecb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ecc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
ecd0: 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  L:.      Tcl_Set
ece0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ecf0: 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49  NULL", TCL_STATI
ed00: 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
ed10: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
ed20: 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54  E_FLOAT:.      T
ed30: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ed40: 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43  erp, "FLOAT", TC
ed50: 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
ed60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ed70: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20  e SQLITE_TEXT:. 
ed80: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
ed90: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54  lt(interp, "TEXT
eda0: 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
edb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
edc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
edd0: 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  OB:.      Tcl_Se
ede0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
edf0: 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54  "BLOB", TCL_STAT
ee00: 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
ee10: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
ee20: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
ee30: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
ee40: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
ee50: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
ee60: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54  olumn_int64 STMT
ee70: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
ee80: 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
ee90: 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
eea0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
eeb0: 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a  row cast as an.*
eec0: 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29 20  * wide (64-bit) 
eed0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
eee0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
eef0: 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  mn_int64(.  void
ef00: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
ef10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ef20: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
ef30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
ef40: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
ef50: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
ef60: 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
ef70: 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28  i64 iVal;..  if(
ef80: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
ef90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
efa0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
efb0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
efc0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
efd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
efe0: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
eff0: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
f000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f010: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
f020: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
f030: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
f040: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
f050: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
f060: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
f070: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
f080: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
f090: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
f0a0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61  CL_ERROR;..  iVa
f0b0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
f0c0: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
f0d0: 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
f0e0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
f0f0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
f100: 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(iVal));.  ret
f110: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
f120: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
f130: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  te3_column_blob 
f140: 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
f150: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
f160: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f  olumn_blob(.  vo
f170: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
f180: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f190: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
f1a0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
f1b0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
f1c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
f1d0: 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
f1e0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f  .  int len;.  co
f1f0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b  nst void *pBlob;
f200: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
f210: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f220: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f230: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
f240: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
f250: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
f260: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
f270: 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
f280: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f290: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
f2a0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
f2b0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
f2c0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
f2d0: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
f2e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f2f0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
f300: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
f310: 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
f320: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f330: 0a 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  pBlob = sqli
f340: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
f350: 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 6c  pStmt, col);.  l
f360: 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  en = sqlite3_col
f370: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
f380: 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
f390: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
f3a0: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
f3b0: 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e  ayObj(pBlob, len
f3c0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
f3d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
f3e0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
f3f0: 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20  umn_double STMT 
f400: 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
f410: 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20  urn the data in 
f420: 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
f430: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
f440: 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f 75  ow cast as a dou
f450: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
f460: 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64  nt test_column_d
f470: 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
f480: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
f490: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f4a0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f4b0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f4c0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f4d0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f4e0: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75    int col;.  dou
f4f0: 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28  ble rVal;..  if(
f500: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
f510: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f520: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
f530: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
f540: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
f550: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f560: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
f570: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
f580: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f590: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
f5a0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
f5b0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
f5c0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
f5d0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
f5e0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
f5f0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
f600: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
f610: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
f620: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61  CL_ERROR;..  rVa
f630: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
f640: 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
f650: 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
f660: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
f670: 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  , Tcl_NewDoubleO
f680: 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(rVal));.  ret
f690: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
f6a0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
f6b0: 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53  te3_data_count S
f6c0: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
f6d0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
f6e0: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
f6f0: 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
f700: 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
f710: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
f720: 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ata_count(.  voi
f730: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
f740: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
f750: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
f760: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
f770: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
f780: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
f790: 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
f7a0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
f7b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f7c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
f7d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
f7e0: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
f7f0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
f800: 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
f810: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
f820: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
f830: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
f840: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
f850: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
f860: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
f870: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f880: 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
f890: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
f8a0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
f8b0: 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53  e3_data_count(pS
f8c0: 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
f8d0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
f8e0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
f8f0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
f900: 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
f910: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
f920: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
f930: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
f940: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
f950: 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
f960: 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
f970: 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75   int test_stmt_u
f980: 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tf8(.  void * cl
f990: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
f9a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
f9b0: 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
f9c0: 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20  on to be invoke 
f9d0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
f9e0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f9f0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fa00: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fa10: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
fa20: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
fa30: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
fa40: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
fa50: 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63  _stmt*, int) = c
fa60: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 63 6f 6e  lientData;.  con
fa70: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  st char *zRet;..
fa80: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
fa90: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
faa0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
fab0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
fac0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
fad0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
fae0: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
faf0: 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
fb00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fb10: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
fb20: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
fb30: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fb40: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fb50: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
fb60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
fb70: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
fb80: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
fb90: 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
fba0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fbb0: 20 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53   zRet = xFunc(pS
fbc0: 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28  tmt, col);.  if(
fbd0: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c   zRet ){.    Tcl
fbe0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
fbf0: 70 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c  p, (char *)zRet,
fc00: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
fc10: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
fc20: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
fc30: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54  3_column_text ST
fc40: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
fc50: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
fc60: 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53  olumn_decltype S
fc70: 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
fc80: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
fc90: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54  column_name STMT
fca0: 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
fcb0: 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
fcc0: 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  utf16(.  void * 
fcd0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
fce0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
fcf0: 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
fd00: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
fd10: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
fd20: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
fd30: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fd40: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fd50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fd60: 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
fd70: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
fd80: 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63  .  int col;.  Tc
fd90: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63  l_Obj *pRet;.  c
fda0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
fdb0: 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16;.  const void
fdc0: 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74   *(*xFunc)(sqlit
fdd0: 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d  e3_stmt*, int) =
fde0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
fdf0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
fe00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
fe10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
fe20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
fe30: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
fe40: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
fe50: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
fe60: 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
fe70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fe80: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
fe90: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
fea0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
feb0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
fec0: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
fed0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
fee0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
fef0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
ff00: 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
ff10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
ff20: 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28  zName16 = xFunc(
ff30: 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69  pStmt, col);.  i
ff40: 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20  f( zName16 ){.  
ff50: 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
ff60: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61  ByteArrayObj(zNa
ff70: 6d 65 31 36 2c 20 73 71 6c 69 74 65 33 75 74 66  me16, sqlite3utf
ff80: 31 36 42 79 74 65 4c 65 6e 28 7a 4e 61 6d 65 31  16ByteLen(zName1
ff90: 36 2c 20 2d 31 29 2b 32 29 3b 0a 20 20 20 20 54  6, -1)+2);.    T
ffa0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ffb0: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
ffc0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
ffd0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
ffe0: 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  /..  return TCL_
fff0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
10000 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
10010 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75  mn_int STMT colu
10020 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
10030 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
10040 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ytes STMT column
10050 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
10060 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
10070 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  es16 STMT column
10080 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
10090 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28  t test_stmt_int(
100a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
100b0 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e  Data,    /* Poin
100c0 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
100d0 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
100e0 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
100f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10100 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10110 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10120 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
10130 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10140 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
10150 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
10160 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d 20  3_stmt*, int) = 
10170 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 69  clientData;..  i
10180 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10190 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
101a0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
101b0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
101c0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
101d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
101e0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
101f0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
10200 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10210 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
10220 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10230 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10240 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10250 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10260 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
10270 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
10280 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
10290 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
102a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
102b0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
102c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
102d0 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d  ntObj(xFunc(pStm
102e0 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74  t, col)));.  ret
102f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
10300 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
10310 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
10320 69 74 65 20 3c 66 69 6c 65 6e 61 6d 65 3e 0a 2a  ite <filename>.*
10330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
10340 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  t_sqlite3OsOpenR
10350 65 61 64 57 72 69 74 65 28 0a 20 20 76 6f 69 64  eadWrite(.  void
10360 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
10370 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10380 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10390 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
103a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73  T objv[].){.  Os
103b0 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20 20  File * pFile;.  
103c0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 64 75  int rc;.  int du
103d0 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  mmy;.  char zBuf
103e0 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
103f0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
10400 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10410 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
10420 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
10430 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
10440 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
10450 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 22 2c  ]), " filename",
10460 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
10470 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
10480 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    pFile = sqlite
10490 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 4f 73  Malloc(sizeof(Os
104a0 46 69 6c 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  File));.  rc = s
104b0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
104c0 57 72 69 74 65 28 54 63 6c 5f 47 65 74 53 74 72  Write(Tcl_GetStr
104d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 70 46  ing(objv[1]), pF
104e0 69 6c 65 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  ile, &dummy);.  
104f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10500 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
10510 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ree(pFile);.    
10520 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
10530 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72  terp, (char *)er
10540 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
10550 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
10560 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10570 20 20 7d 0a 20 20 6d 61 6b 65 50 6f 69 6e 74 65    }.  makePointe
10580 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
10590 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 54 63 6c  f, pFile);.  Tcl
105a0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
105b0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
105c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
105d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
105e0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
105f0 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a 2a   <file handle>.*
10600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
10610 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  t_sqlite3OsClose
10620 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10630 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10640 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10650 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10660 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10670 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70  .){.  OsFile * p
10680 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
10690 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
106a0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
106b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
106c0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
106d0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
106e0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
106f0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
10700 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b 0a  ilehandle", 0);.
10710 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10720 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
10730 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   getFilePointer(
10740 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10750 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10760 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &pFile) ){.    r
10770 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10780 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10790 74 65 33 4f 73 43 6c 6f 73 65 28 70 46 69 6c 65  te3OsClose(pFile
107a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
107b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
107c0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
107d0 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f  rp, (char *)erro
107e0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
107f0 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
10800 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10810 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
10820 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  File);.  return 
10830 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10840 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10850 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e  OsLock <file han
10860 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79 70 65 3e 0a  dle> <locktype>.
10870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
10880 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  st_sqlite3OsLock
10890 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
108a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
108b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
108c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
108d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
108e0 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70  .){.  OsFile * p
108f0 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
10900 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
10910 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10920 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10930 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10940 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
10950 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
10960 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a 20  ing(objv[0]), . 
10970 20 20 20 20 20 20 20 22 20 66 69 6c 65 68 61 6e         " filehan
10980 64 6c 65 20 28 53 48 41 52 45 44 7c 52 45 53 45  dle (SHARED|RESE
10990 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c 45 58 43  RVED|PENDING|EXC
109a0 4c 55 53 49 56 45 29 22 2c 20 30 29 3b 0a 20 20  LUSIVE)", 0);.  
109b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
109c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
109d0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 6e  etFilePointer(in
109e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
109f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
10a00 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
10a10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10a20 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d 73 74 72   }..  if( 0==str
10a30 63 6d 70 28 22 53 48 41 52 45 44 22 2c 20 54 63  cmp("SHARED", Tc
10a40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10a50 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20  [2])) ){.    rc 
10a60 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
10a70 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  pFile, SHARED_LO
10a80 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  CK);.  }.  else 
10a90 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 52  if( 0==strcmp("R
10aa0 45 53 45 52 56 45 44 22 2c 20 54 63 6c 5f 47 65  ESERVED", Tcl_Ge
10ab0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
10ac0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
10ad0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c  lite3OsLock(pFil
10ae0 65 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e, RESERVED_LOCK
10af0 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
10b00 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 50 45 4e  ( 0==strcmp("PEN
10b10 44 49 4e 47 22 2c 20 54 63 6c 5f 47 65 74 53 74  DING", Tcl_GetSt
10b20 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29  ring(objv[2])) )
10b30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
10b40 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  e3OsLock(pFile, 
10b50 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 3b 0a 20  PENDING_LOCK);. 
10b60 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d   }.  else if( 0=
10b70 3d 73 74 72 63 6d 70 28 22 45 58 43 4c 55 53 49  =strcmp("EXCLUSI
10b80 56 45 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  VE", Tcl_GetStri
10b90 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a  ng(objv[2])) ){.
10ba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10bb0 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 45 58  OsLock(pFile, EX
10bc0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
10bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
10be0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10bf0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
10c00 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
10c10 22 2c 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ", .        Tcl_
10c20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
10c30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22 20 66  ]), .        " f
10c40 69 6c 65 68 61 6e 64 6c 65 20 28 53 48 41 52 45  ilehandle (SHARE
10c50 44 7c 52 45 53 45 52 56 45 44 7c 50 45 4e 44 49  D|RESERVED|PENDI
10c60 4e 47 7c 45 58 43 4c 55 53 49 56 45 29 22 2c 20  NG|EXCLUSIVE)", 
10c70 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10c80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
10c90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ca0 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
10cb0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
10cc0 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d  (char *)errorNam
10cd0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
10ce0 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
10cf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10d00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10d10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10d20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 20  sqlite3OsUnlock 
10d30 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a 2a 2f  <file handle>.*/
10d40 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
10d50 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b  _sqlite3OsUnlock
10d60 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10d70 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10d80 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10d90 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10da0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10db0 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70  .){.  OsFile * p
10dc0 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
10dd0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
10de0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10df0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10e00 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10e10 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
10e20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10e30 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
10e40 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b 0a  ilehandle", 0);.
10e50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10e60 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
10e70 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   getFilePointer(
10e80 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10e90 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10ea0 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &pFile) ){.    r
10eb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10ec0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10ed0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 69 6c  te3OsUnlock(pFil
10ee0 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69  e, NO_LOCK);.  i
10ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10f00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
10f10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
10f20 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28  har *)errorName(
10f30 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
10f40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10f50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
10f60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
10f70 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
10f80 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
10f90 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ame.*/.static in
10fa0 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  t test_sqlite3Os
10fb0 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 0a 20 20  TempFileName(.  
10fc0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10fd0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10fe0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10ff0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11000 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11010 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c    char zFile[SQL
11020 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
11030 45 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  E];.  int rc;.. 
11040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
11050 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c  empFileName(zFil
11060 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
11070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
11080 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
11090 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72  erp, (char *)err
110a0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
110b0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
110c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
110d0 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
110e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 46  esult(interp, zF
110f0 69 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ile, 0);.  retur
11100 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
11110 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
11120 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20  e_set_magic  DB 
11130 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a   MAGIC-NUMBER.**
11140 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e  .** Set the db->
11150 6d 61 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68  magic value.  Th
11160 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
11170 73 74 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72  st error recover
11180 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74  y logic..*/.stat
11190 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65  ic int sqlite_se
111a0 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20  t_magic(.  void 
111b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
111c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
111d0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
111e0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
111f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
11200 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
11210 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11220 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
11230 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
11240 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
11250 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20  [0],.         " 
11260 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20  DB MAGIC", 0);. 
11270 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11280 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
11290 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
112a0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
112b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
112c0 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
112d0 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
112e0 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29  ITE_MAGIC_OPEN")
112f0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
11300 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
11310 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GIC_OPEN;.  }els
11320 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
11330 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
11340 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20  GIC_CLOSED")==0 
11350 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
11360 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
11370 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  CLOSED;.  }else 
11380 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
11390 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
113a0 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20  C_BUSY")==0 ){. 
113b0 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
113c0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
113d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
113e0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
113f0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
11400 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  R")==0 ){.    db
11410 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
11420 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20  _MAGIC_ERROR;.  
11430 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65  }else if( Tcl_Ge
11440 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
11450 76 5b 32 5d 2c 20 26 64 62 2d 3e 6d 61 67 69 63  v[2], &db->magic
11460 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11470 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11480 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11490 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
114a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
114b0 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72  pt  DB .**.** Tr
114c0 69 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75  igger an interru
114d0 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74  pt on DB.*/.stat
114e0 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65  ic int test_inte
114f0 72 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20  rrupt(.  void * 
11500 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11510 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11520 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
11530 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
11540 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
11550 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
11560 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11570 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
11580 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
11590 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
115a0 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ], " DB", 0);.  
115b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
115c0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
115d0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
115e0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
115f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11600 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ROR;.  sqlite3_i
11610 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20  nterrupt(db);.  
11620 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11630 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
11640 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 6d 73  sqlite3_sleep ms
11650 20 0a 2a 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f   .**.** Sleep fo
11660 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
11670 6e 75 6d 62 65 72 20 6f 66 20 6d 73 2e 0a 2a 2f  number of ms..*/
11680 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e  .#if 0.static in
11690 74 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20  t test_sleep(.  
116a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
116b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
116c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
116d0 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
116e0 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
116f0 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
11700 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
11710 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11720 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11730 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11740 20 61 72 67 76 5b 30 5d 2c 20 22 20 6d 73 22 2c   argv[0], " ms",
11750 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
11760 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11770 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11780 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11790 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
117a0 73 6c 65 65 70 28 61 74 6f 69 28 61 72 67 76 5b  sleep(atoi(argv[
117b0 31 5d 29 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  1]))));.  return
117c0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
117d0 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
117e0 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79   tcl_variable_ty
117f0 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45 0a  pe VARIABLENAME.
11800 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
11810 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 74   name of the int
11820 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
11830 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20  tion for the.** 
11840 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69 76  value of the giv
11850 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  en variable..*/.
11860 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 5f 76  static int tcl_v
11870 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a 20 20  ariable_type(.  
11880 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11890 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
118a0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
118b0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
118c0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
118d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b    Tcl_Obj *pVar;
118e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
118f0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
11900 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
11910 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41 42 4c  , objv, "VARIABL
11920 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
11930 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11940 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56   pVar = Tcl_GetV
11950 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 54 63  ar2Ex(interp, Tc
11960 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11970 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45 41  [1]), 0, TCL_LEA
11980 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20 69  VE_ERR_MSG);.  i
11990 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72 65 74  f( pVar==0 ) ret
119a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
119b0 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70 65 50   if( pVar->typeP
119c0 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  tr ){.    Tcl_Se
119d0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
119e0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
119f0 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65 50 74  Obj(pVar->typePt
11a00 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  r->name, -1));. 
11a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
11a20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
11a30 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 65  s routine sets e
11a40 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 67 6c  ntries in the gl
11a50 6f 62 61 6c 20 3a 3a 73 71 6c 69 74 65 5f 6f 70  obal ::sqlite_op
11a60 74 69 6f 6e 73 28 29 20 61 72 72 61 79 20 76 61  tions() array va
11a70 72 69 61 62 6c 65 0a 2a 2a 20 61 63 63 6f 72 64  riable.** accord
11a80 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 70 69  ing to the compi
11a90 6c 65 2d 74 69 6d 65 20 63 6f 6e 66 69 67 75 72  le-time configur
11aa0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
11ab0 61 62 61 73 65 2e 20 20 54 65 73 74 0a 2a 2a 20  abase.  Test.** 
11ac0 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20 74  procedures use t
11ad0 68 69 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  his to determine
11ae0 20 77 68 65 6e 20 74 65 73 74 73 20 73 68 6f 75   when tests shou
11af0 6c 64 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a 2a  ld be omitted..*
11b00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
11b10 74 5f 6f 70 74 69 6f 6e 73 28 54 63 6c 5f 49 6e  t_options(Tcl_In
11b20 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 23  terp *interp){.#
11b30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11b40 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 54  T_ALTERTABLE.  T
11b50 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
11b60 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
11b70 6e 73 22 2c 20 22 61 6c 74 65 72 74 61 62 6c 65  ns", "altertable
11b80 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "0", TCL_GLOB
11b90 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a  AL_ONLY);.#else.
11ba0 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
11bb0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
11bc0 74 69 6f 6e 73 22 2c 20 22 61 6c 74 65 72 74 61  tions", "alterta
11bd0 62 6c 65 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  ble", "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 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11c10 41 54 49 4f 4e 0a 20 20 54 63 6c 5f 53 65 74 56  ATION.  Tcl_SetV
11c20 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
11c30 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61  ite_options", "a
11c40 75 74 68 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47  uth", "0", TCL_G
11c50 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c  LOBAL_ONLY);.#el
11c60 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  se.  Tcl_SetVar2
11c70 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11c80 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61 75 74 68  _options", "auth
11c90 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
11ca0 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
11cb0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11cc0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
11cd0 4e 54 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  NT.  Tcl_SetVar2
11ce0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11cf0 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61 75 74 6f  _options", "auto
11d00 69 6e 63 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47  inc", "0", TCL_G
11d10 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c  LOBAL_ONLY);.#el
11d20 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  se.  Tcl_SetVar2
11d30 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11d40 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61 75 74 6f  _options", "auto
11d50 69 6e 63 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  inc", "1", TCL_G
11d60 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
11d70 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
11d80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11d90 55 4d 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  UM.  Tcl_SetVar2
11da0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
11db0 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61 75 74 6f  _options", "auto
11dc0 76 61 63 75 75 6d 22 2c 20 22 30 22 2c 20 54 43  vacuum", "0", TC
11dd0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
11de0 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
11df0 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
11e00 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 61  ite_options", "a
11e10 75 74 6f 76 61 63 75 75 6d 22 2c 20 22 31 22 2c  utovacuum", "1",
11e20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
11e30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
11e40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11e50 55 55 4d 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  UUM */.#if !defi
11e60 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
11e70 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 20 7c  LT_AUTOVACUUM) |
11e80 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  | SQLITE_DEFAULT
11e90 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 30 0a 20  _AUTOVACUUM==0. 
11ea0 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11eb0 65 72 70 2c 22 73 71 6c 69 74 65 5f 6f 70 74 69  erp,"sqlite_opti
11ec0 6f 6e 73 22 2c 22 64 65 66 61 75 6c 74 5f 61 75  ons","default_au
11ed0 74 6f 76 61 63 75 75 6d 22 2c 22 30 22 2c 54 43  tovacuum","0",TC
11ee0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
11ef0 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
11f00 61 72 32 28 69 6e 74 65 72 70 2c 22 73 71 6c 69  ar2(interp,"sqli
11f10 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 22 64 65 66  te_options","def
11f20 61 75 6c 74 5f 61 75 74 6f 76 61 63 75 75 6d 22  ault_autovacuum"
11f30 2c 22 31 22 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  ,"1",TCL_GLOBAL_
11f40 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
11f50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11f60 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
11f70 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11f80 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
11f90 69 6f 6e 73 22 2c 20 22 62 6c 6f 62 6c 69 74 22  ions", "bloblit"
11fa0 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "0", TCL_GLOBA
11fb0 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20  L_ONLY);.#else. 
11fc0 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11fd0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
11fe0 69 6f 6e 73 22 2c 20 22 62 6c 6f 62 6c 69 74 22  ions", "bloblit"
11ff0 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "1", TCL_GLOBA
12000 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  L_ONLY);.#endif.
12010 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12020 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12030 45 43 54 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  ECT.  Tcl_SetVar
12040 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
12050 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 63 6f 6d  e_options", "com
12060 70 6f 75 6e 64 22 2c 20 22 30 22 2c 20 54 43 4c  pound", "0", TCL
12070 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
12080 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61  else.  Tcl_SetVa
12090 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
120a0 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 63 6f  te_options", "co
120b0 6d 70 6f 75 6e 64 22 2c 20 22 31 22 2c 20 54 43  mpound", "1", TC
120c0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
120d0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
120e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 46 4c  QLITE_OMIT_CONFL
120f0 49 43 54 5f 43 4c 41 55 53 45 0a 20 20 54 63 6c  ICT_CLAUSE.  Tcl
12100 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
12110 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
12120 22 2c 20 22 63 6f 6e 66 6c 69 63 74 22 2c 20 22  ", "conflict", "
12130 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
12140 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63  NLY);.#else.  Tc
12150 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
12160 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
12170 73 22 2c 20 22 63 6f 6e 66 6c 69 63 74 22 2c 20  s", "conflict", 
12180 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
12190 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
121a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
121b0 54 5f 43 55 52 53 4f 52 0a 20 20 54 63 6c 5f 53  T_CURSOR.  Tcl_S
121c0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
121d0 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
121e0 20 22 63 75 72 73 6f 72 22 2c 20 22 30 22 2c 20   "cursor", "0", 
121f0 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
12200 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65  ;.#else.  Tcl_Se
12210 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
12220 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
12230 22 63 75 72 73 6f 72 22 2c 20 22 31 22 2c 20 54  "cursor", "1", T
12240 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
12250 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
12260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45  SQLITE_OMIT_DATE
12270 54 49 4d 45 5f 46 55 4e 43 53 0a 20 20 54 63 6c  TIME_FUNCS.  Tcl
12280 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
12290 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
122a0 22 2c 20 22 64 61 74 65 74 69 6d 65 22 2c 20 22  ", "datetime", "
122b0 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
122c0 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63  NLY);.#else.  Tc
122d0 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
122e0 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
122f0 73 22 2c 20 22 64 61 74 65 74 69 6d 65 22 2c 20  s", "datetime", 
12300 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
12310 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
12320 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12330 54 5f 45 58 50 4c 41 49 4e 0a 20 20 54 63 6c 5f  T_EXPLAIN.  Tcl_
12340 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
12350 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
12360 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 22 30 22  , "explain", "0"
12370 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
12380 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
12390 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
123a0 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
123b0 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 22 31 22  , "explain", "1"
123c0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
123d0 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  Y);.#endif..#ifd
123e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
123f0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
12400 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
12410 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
12420 6f 6e 73 22 2c 20 22 66 6c 6f 61 74 69 6e 67 70  ons", "floatingp
12430 6f 69 6e 74 22 2c 20 22 30 22 2c 20 54 43 4c 5f  oint", "0", TCL_
12440 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
12450 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
12460 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
12470 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 66 6c 6f  e_options", "flo
12480 61 74 69 6e 67 70 6f 69 6e 74 22 2c 20 22 31 22  atingpoint", "1"
12490 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
124a0 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  Y);.#endif..#ifd
124b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
124c0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 63 6c  OREIGN_KEY.  Tcl
124d0 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
124e0 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
124f0 22 2c 20 22 66 6f 72 65 69 67 6e 6b 65 79 22 2c  ", "foreignkey",
12500 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "0", TCL_GLOBAL
12510 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20  _ONLY);.#else.  
12520 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
12530 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
12540 6f 6e 73 22 2c 20 22 66 6f 72 65 69 67 6e 6b 65  ons", "foreignke
12550 79 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f  y", "1", TCL_GLO
12560 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  BAL_ONLY);.#endi
12570 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
12580 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
12590 43 48 45 43 4b 0a 20 20 54 63 6c 5f 53 65 74 56  CHECK.  Tcl_SetV
125a0 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
125b0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 69  ite_options", "i
125c0 6e 74 65 67 72 69 74 79 63 6b 22 2c 20 22 30 22  ntegrityck", "0"
125d0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
125e0 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
125f0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
12600 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
12610 2c 20 22 69 6e 74 65 67 72 69 74 79 63 6b 22 2c  , "integrityck",
12620 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "1", TCL_GLOBAL
12630 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  _ONLY);.#endif..
12640 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12650 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 54 63  IT_MEMORYDB.  Tc
12660 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
12670 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
12680 73 22 2c 20 22 6d 65 6d 6f 72 79 64 62 22 2c 20  s", "memorydb", 
12690 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "0", TCL_GLOBAL_
126a0 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54  ONLY);.#else.  T
126b0 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
126c0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
126d0 6e 73 22 2c 20 22 6d 65 6d 6f 72 79 64 62 22 2c  ns", "memorydb",
126e0 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "1", TCL_GLOBAL
126f0 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  _ONLY);.#endif..
12700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12710 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
12720 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69  .  Tcl_SetVar2(i
12730 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
12740 70 74 69 6f 6e 73 22 2c 20 22 70 61 67 65 72 5f  ptions", "pager_
12750 70 72 61 67 6d 61 73 22 2c 20 22 30 22 2c 20 54  pragmas", "0", T
12760 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
12770 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74  .#else.  Tcl_Set
12780 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
12790 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
127a0 70 61 67 65 72 5f 70 72 61 67 6d 61 73 22 2c 20  pager_pragmas", 
127b0 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
127c0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
127d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
127e0 54 5f 50 52 41 47 4d 41 0a 20 20 54 63 6c 5f 53  T_PRAGMA.  Tcl_S
127f0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
12800 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
12810 20 22 70 72 61 67 6d 61 22 2c 20 22 30 22 2c 20   "pragma", "0", 
12820 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
12830 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  ;.  Tcl_SetVar2(
12840 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
12850 6f 70 74 69 6f 6e 73 22 2c 20 22 69 6e 74 65 67  options", "integ
12860 72 69 74 79 63 6b 22 2c 20 22 30 22 2c 20 54 43  rityck", "0", TC
12870 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
12880 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
12890 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
128a0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 70  ite_options", "p
128b0 72 61 67 6d 61 22 2c 20 22 31 22 2c 20 54 43 4c  ragma", "1", TCL
128c0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
128d0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
128e0 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
128f0 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 54 63  SS_CALLBACK.  Tc
12900 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
12910 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
12920 73 22 2c 20 22 70 72 6f 67 72 65 73 73 22 2c 20  s", "progress", 
12930 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "0", TCL_GLOBAL_
12940 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54  ONLY);.#else.  T
12950 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
12960 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
12970 6e 73 22 2c 20 22 70 72 6f 67 72 65 73 73 22 2c  ns", "progress",
12980 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "1", TCL_GLOBAL
12990 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  _ONLY);.#endif..
129a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
129b0 49 54 5f 52 45 49 4e 44 45 58 0a 20 20 54 63 6c  IT_REINDEX.  Tcl
129c0 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
129d0 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
129e0 22 2c 20 22 72 65 69 6e 64 65 78 22 2c 20 22 30  ", "reindex", "0
129f0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
12a00 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c  LY);.#else.  Tcl
12a10 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
12a20 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
12a30 22 2c 20 22 72 65 69 6e 64 65 78 22 2c 20 22 31  ", "reindex", "1
12a40 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
12a50 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  LY);.#endif..#if
12a60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12a70 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20  SCHEMA_PRAGMAS. 
12a80 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
12a90 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
12aa0 69 6f 6e 73 22 2c 20 22 73 63 68 65 6d 61 5f 70  ions", "schema_p
12ab0 72 61 67 6d 61 73 22 2c 20 22 30 22 2c 20 54 43  ragmas", "0", TC
12ac0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
12ad0 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
12ae0 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
12af0 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 73  ite_options", "s
12b00 63 68 65 6d 61 5f 70 72 61 67 6d 61 73 22 2c 20  chema_pragmas", 
12b10 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
12b20 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ONLY);.#endif..#
12b30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12b40 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  T_SCHEMA_VERSION
12b50 5f 50 52 41 47 4d 41 53 0a 20 20 54 63 6c 5f 53  _PRAGMAS.  Tcl_S
12b60 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
12b70 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
12b80 20 22 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e   "schema_version
12b90 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "0", TCL_GLOB
12ba0 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a  AL_ONLY);.#else.
12bb0 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
12bc0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
12bd0 74 69 6f 6e 73 22 2c 20 22 73 63 68 65 6d 61 5f  tions", "schema_
12be0 76 65 72 73 69 6f 6e 22 2c 20 22 31 22 2c 20 54  version", "1", T
12bf0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
12c00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
12c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12c20 55 45 52 59 0a 20 20 54 63 6c 5f 53 65 74 56 61  UERY.  Tcl_SetVa
12c30 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
12c40 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 73 75  te_options", "su
12c50 62 71 75 65 72 79 22 2c 20 22 30 22 2c 20 54 43  bquery", "0", TC
12c60 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
12c70 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56  #else.  Tcl_SetV
12c80 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ar2(interp, "sql
12c90 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 73  ite_options", "s
12ca0 75 62 71 75 65 72 79 22 2c 20 22 31 22 2c 20 54  ubquery", "1", T
12cb0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
12cc0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
12cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 43 4c 5f  SQLITE_OMIT_TCL_
12ce0 56 41 52 49 41 42 4c 45 0a 20 20 54 63 6c 5f 53  VARIABLE.  Tcl_S
12cf0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
12d00 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
12d10 20 22 74 63 6c 76 61 72 22 2c 20 22 30 22 2c 20   "tclvar", "0", 
12d20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
12d30 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65  ;.#else.  Tcl_Se
12d40 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
12d50 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
12d60 22 74 63 6c 76 61 72 22 2c 20 22 31 22 2c 20 54  "tclvar", "1", T
12d70 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
12d80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
12d90 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
12da0 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 20   && THREADSAFE. 
12db0 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
12dc0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
12dd0 69 6f 6e 73 22 2c 20 22 74 68 72 65 61 64 73 61  ions", "threadsa
12de0 66 65 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c  fe", "1", TCL_GL
12df0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73  OBAL_ONLY);.#els
12e00 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  e.  Tcl_SetVar2(
12e10 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
12e20 6f 70 74 69 6f 6e 73 22 2c 20 22 74 68 72 65 61  options", "threa
12e30 64 73 61 66 65 22 2c 20 22 30 22 2c 20 54 43 4c  dsafe", "0", TCL
12e40 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
12e50 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
12e60 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
12e70 52 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  R.  Tcl_SetVar2(
12e80 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
12e90 6f 70 74 69 6f 6e 73 22 2c 20 22 74 72 69 67 67  options", "trigg
12ea0 65 72 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c  er", "0", TCL_GL
12eb0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73  OBAL_ONLY);.#els
12ec0 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  e.  Tcl_SetVar2(
12ed0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
12ee0 6f 70 74 69 6f 6e 73 22 2c 20 22 74 72 69 67 67  options", "trigg
12ef0 65 72 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c  er", "1", TCL_GL
12f00 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64  OBAL_ONLY);.#end
12f10 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
12f20 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54  E_OMIT_UTF16.  T
12f30 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
12f40 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
12f50 6e 73 22 2c 20 22 75 74 66 31 36 22 2c 20 22 30  ns", "utf16", "0
12f60 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
12f70 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c  LY);.#else.  Tcl
12f80 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
12f90 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
12fa0 22 2c 20 22 75 74 66 31 36 22 2c 20 22 31 22 2c  ", "utf16", "1",
12fb0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
12fc0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
12fd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
12fe0 43 55 55 4d 0a 20 20 54 63 6c 5f 53 65 74 56 61  CUUM.  Tcl_SetVa
12ff0 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
13000 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 76 61  te_options", "va
13010 63 75 75 6d 22 2c 20 22 30 22 2c 20 54 43 4c 5f  cuum", "0", TCL_
13020 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
13030 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
13040 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
13050 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 76 61 63  e_options", "vac
13060 75 75 6d 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  uum", "1", TCL_G
13070 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
13080 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
13090 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 54  TE_OMIT_VIEW.  T
130a0 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
130b0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
130c0 6e 73 22 2c 20 22 76 69 65 77 22 2c 20 22 30 22  ns", "view", "0"
130d0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
130e0 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
130f0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
13100 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
13110 2c 20 22 76 69 65 77 22 2c 20 22 31 22 2c 20 54  , "view", "1", T
13120 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
13130 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13140 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e   Register comman
13150 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20  ds with the TCL 
13160 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
13170 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f  int Sqlitetest1_
13180 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
13190 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65  *interp){.  exte
131a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
131b0 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65  earch_count;.  e
131c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
131d0 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
131e0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
131f0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
13200 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  e_count;.  exter
13210 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f  n int sqlite3_so
13220 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  rt_count;.  exte
13230 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
13240 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20 73  urrent_time;.  s
13250 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
13260 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
13270 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f  .     Tcl_CmdPro
13280 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43  c *xProc;.  } aC
13290 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
132a0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
132b0 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
132c0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
132d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
132e0 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt    },.     { 
132f0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
13300 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
13310 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
13320 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
13330 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt64  },.     { 
13340 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
13350 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  _str",          
13360 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
13370 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
13380 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  tr    },.     { 
13390 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
133a0 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20  _stronly",      
133b0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
133c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
133d0 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20  tronly},.     { 
133e0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
133f0 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
13400 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
13410 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
13420 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20  ouble },.     { 
13430 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
13440 5f 73 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20  _scaled",       
13450 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
13460 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
13470 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20  caled },.     { 
13480 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
13490 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  _z_test",       
134a0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
134b0 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20  est_mprintf_z   
134c0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
134d0 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
134e0 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 20 20 20  ert_rowid",     
134f0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
13500 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20 20  st_last_rowid   
13510 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
13520 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e  qlite3_exec_prin
13530 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  tf",           (
13540 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
13550 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 20  t_exec_printf   
13560 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
13570 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
13580 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54  printf",      (T
13590 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
135a0 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
135b0 66 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  f },.     { "sql
135c0 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20  ite3_close",    
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
135e0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
135f0 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20  e_test_close    
13600 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
13610 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13620 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
13630 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63  _CmdProc*)test_c
13640 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20  reate_function  
13650 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
13660 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  e3_create_aggreg
13670 61 74 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f  ate",      (Tcl_
13680 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72  CmdProc*)test_cr
13690 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d  eate_aggregate }
136a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
136b0 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66  _register_test_f
136c0 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43  unction", (Tcl_C
136d0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67  mdProc*)test_reg
136e0 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c  ister_func    },
136f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
13700 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20  abort",         
13710 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
13720 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62  dProc*)sqlite_ab
13730 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ort          },.
13740 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  #ifdef SQLITE_ME
13750 4d 44 45 42 55 47 0a 20 20 20 20 20 7b 20 22 73  MDEBUG.     { "s
13760 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
13770 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  l",            (
13780 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
13790 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20  ite_malloc_fail 
137a0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
137b0 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74  lite_malloc_stat
137c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ",            (T
137d0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
137e0 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 20 20  te_malloc_stat  
137f0 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
13800 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22   { "sqlite_bind"
13810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13820 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
13830 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20  *)test_bind     
13840 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
13850 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  { "breakpoint", 
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
13880 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74  )test_breakpoint
13890 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
138a0 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20   "sqlite3_key", 
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
138d0 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20  test_key        
138e0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
138f0 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c  "sqlite3_rekey",
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13910 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
13920 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20  est_rekey       
13930 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
13940 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
13950 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
13960 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
13970 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
13980 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
13990 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
139a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
139b0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
139c0 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20  t_interrupt     
139d0 20 20 20 7d 2c 0a 23 69 66 20 30 0a 20 20 20 20     },.#if 0.    
139e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65   { "sqlite3_slee
139f0 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
13a00 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
13a10 2a 29 74 65 73 74 5f 73 6c 65 65 70 20 20 20 20  *)test_sleep    
13a20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69          },.#endi
13a30 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  f.  };.  static 
13a40 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
13a50 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
13a60 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a  Tcl_ObjCmdProc *
13a70 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64  xProc;.     void
13a80 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20   *clientData;.  
13a90 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a  } aObjCmd[] = {.
13aa0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
13ab0 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20  bind_int",      
13ac0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
13ad0 64 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c  d_int,      0 },
13ae0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
13af0 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20  _bind_int64",   
13b00 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
13b10 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d  nd_int64,    0 }
13b20 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
13b30 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20  3_bind_double", 
13b40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
13b50 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20  ind_double,   0 
13b60 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
13b70 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20  e3_bind_null",  
13b80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
13b90 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30  bind_null     ,0
13ba0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
13bb0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20  te3_bind_text", 
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
13bd0 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c  _bind_text     ,
13be0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
13bf0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
13c00 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
13c10 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20  t_bind_text16   
13c20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
13c30 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22  lite3_bind_blob"
13c40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
13c50 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20  st_bind_blob    
13c60 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
13c70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
13c80 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74  meter_count",  t
13c90 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
13ca0 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20  er_count, 0},.  
13cb0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
13cc0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
13cd0 65 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f  e",   test_bind_
13ce0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20  parameter_name, 
13cf0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
13d00 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
13d10 74 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73  ter_index",  tes
13d20 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
13d30 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 23 69 66 20  _index, 0},.#if 
13d40 30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  0.     { "sqlite
13d50 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  3_clear_bindings
13d60 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63  ",        test_c
13d70 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30  lear_bindings, 0
13d80 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
13d90 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64   "sqlite3_errcod
13da0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
13db0 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20    test_errcode  
13dc0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
13dd0 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
13de0 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
13df0 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20     test_errmsg  
13e00 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
13e10 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
13e20 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  sg16",          
13e30 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31      test_errmsg1
13e40 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  6      ,0 },.   
13e50 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
13e60 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
13e70 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20       test_open  
13e80 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
13e90 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
13ea0 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  en16",          
13eb0 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31        test_open1
13ec0 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  6        ,0 },. 
13ed0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
13ee0 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20  omplete16",     
13ef0 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70         test_comp
13f00 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a  lete16    ,0 },.
13f10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
13f20 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20  _prepare",      
13f30 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
13f40 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d  epare       ,0 }
13f50 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
13f60 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20  3_prepare16",   
13f70 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
13f80 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20  repare16     ,0 
13f90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
13fa0 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20 20 20  e3_finalize",   
13fb0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
13fc0 66 69 6e 61 6c 69 7a 65 20 20 20 20 20 20 2c 30  finalize      ,0
13fd0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
13fe0 74 65 33 5f 72 65 73 65 74 22 2c 20 20 20 20 20  te3_reset",     
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
14000 5f 72 65 73 65 74 20 20 20 20 20 20 20 20 20 2c  _reset         ,
14010 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
14020 69 74 65 33 5f 65 78 70 69 72 65 64 22 2c 20 20  ite3_expired",  
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
14040 74 5f 65 78 70 69 72 65 64 20 20 20 20 20 20 20  t_expired       
14050 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
14060 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 22 2c 20  lite3_changes", 
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
14080 73 74 5f 63 68 61 6e 67 65 73 20 20 20 20 20 20  st_changes      
14090 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
140a0 71 6c 69 74 65 33 5f 73 74 65 70 22 2c 20 20 20  qlite3_step",   
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
140c0 65 73 74 5f 73 74 65 70 20 20 20 20 20 20 20 20  est_step        
140d0 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a    ,0 },..     /*
140e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
140f0 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20  *() API */.     
14100 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
14110 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20  n_count",       
14120 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63     test_column_c
14130 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20  ount  ,0 },.    
14140 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61   { "sqlite3_data
14150 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20  _count",        
14160 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f      test_data_co
14170 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  unt    ,0 },.   
14180 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
14190 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20  umn_type",      
141a0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
141b0 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20  _type   ,0 },.  
141c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
141d0 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20  lumn_blob",     
141e0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
141f0 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20  n_blob   ,0 },. 
14200 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
14210 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20  olumn_double",  
14220 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
14230 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a  mn_double ,0 },.
14240 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
14250 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20  column_int64",  
14260 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
14270 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c  umn_int64  ,0 },
14280 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
14290 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20  _column_text",  
142a0 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75       test_stmt_u
142b0 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f  tf8,  sqlite3_co
142c0 6c 75 6d 6e 5f 74 65 78 74 20 20 20 20 20 20 7d  lumn_text      }
142d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
142e0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
142f0 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  e",   test_stmt_
14300 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63  utf8,  sqlite3_c
14310 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 20  olumn_decltype  
14320 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
14330 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c  e3_column_name",
14340 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
14350 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f  _utf8,  sqlite3_
14360 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 20 20 20 20  column_name     
14370 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
14380 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c  te3_column_int",
14390 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d          test_stm
143a0 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74 65 33  t_int,   sqlite3
143b0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 20 20 20  _column_int     
143c0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
143d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
143e0 73 22 2c 20 20 20 20 20 20 74 65 73 74 5f 73 74  s",      test_st
143f0 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74 65  mt_int,   sqlite
14400 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 20  3_column_bytes  
14410 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
14420 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
14430 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
14440 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c  column_bytes16",
14450 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
14460 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  t,   sqlite3_col
14470 75 6d 6e 5f 62 79 74 65 73 31 36 20 20 20 7d 2c  umn_bytes16   },
14480 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
14490 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c  _column_text16",
144a0 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75       test_stmt_u
144b0 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f  tf16, sqlite3_co
144c0 6c 75 6d 6e 5f 74 65 78 74 31 36 20 20 20 20 7d  lumn_text16    }
144d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
144e0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
144f0 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
14500 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63  utf16, sqlite3_c
14510 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
14520 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
14530 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36  e3_column_name16
14540 22 2c 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74  ",     test_stmt
14550 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f  _utf16, sqlite3_
14560 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 20 20 20  column_name16   
14570 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   },.#endif..    
14580 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72   /* Functions fr
14590 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 20 20 20 20 20  om os.h */.     
145a0 7b 20 22 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  { "sqlite3OsOpen
145b0 52 65 61 64 57 72 69 74 65 22 2c 74 65 73 74 5f  ReadWrite",test_
145c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
145d0 64 57 72 69 74 65 2c 20 30 20 7d 2c 0a 20 20 20  dWrite, 0 },.   
145e0 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 43 6c    { "sqlite3OsCl
145f0 6f 73 65 22 2c 20 20 20 20 20 20 20 20 74 65 73  ose",        tes
14600 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  t_sqlite3OsClose
14610 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
14620 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 22 2c 20 20  qlite3OsLock",  
14630 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69         test_sqli
14640 74 65 33 4f 73 4c 6f 63 6b 2c 20 30 20 7d 2c 0a  te3OsLock, 0 },.
14650 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f       { "sqlite3O
14660 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 22 2c 20  sTempFileName", 
14670 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 54 65  test_sqlite3OsTe
14680 6d 70 46 69 6c 65 4e 61 6d 65 2c 20 30 20 7d 2c  mpFileName, 0 },
14690 0a 20 20 20 0a 20 20 20 20 20 2f 2a 20 43 75 73  .   .     /* Cus
146a0 74 6f 6d 20 74 65 73 74 20 69 6e 74 65 72 66 61  tom test interfa
146b0 63 65 73 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73  ces */.     { "s
146c0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 22 2c  qlite3OsUnlock",
146d0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
146e0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 2c 20 30  lite3OsUnlock, 0
146f0 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
14700 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
14710 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73  .     { "add_tes
14720 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20  t_collate",     
14730 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c     test_collate,
14740 20 30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c   0            },
14750 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73  .     { "add_tes
14760 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
14770 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  ", test_collate_
14780 6e 65 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c  needed, 0     },
14790 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73  .     { "add_tes
147a0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  t_function",    
147b0 20 20 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e     test_function
147c0 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c  , 0           },
147d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
147e0 73 71 6c 69 74 65 33 5f 63 72 61 73 68 70 61 72  sqlite3_crashpar
147f0 61 6d 73 22 2c 20 20 20 20 20 73 71 6c 69 74 65  ams",     sqlite
14800 33 5f 63 72 61 73 68 70 61 72 61 6d 73 2c 20 30  3_crashparams, 0
14810 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
14820 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72  sqlite3_test_err
14830 73 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65  str",     test_e
14840 72 72 73 74 72 2c 20 30 20 20 20 20 20 20 20 20  rrstr, 0        
14850 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
14860 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
14870 65 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61  e",       tcl_va
14880 72 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20  riable_type, 0  
14890 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73       },.  };.  s
148a0 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73  tatic int bitmas
148b0 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  k_size = sizeof(
148c0 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e  Bitmask)*8;.  in
148d0 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  t i;.  extern in
148e0 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61  t sqlite3_os_tra
148f0 63 65 3b 0a 20 0a 0a 20 20 66 6f 72 28 69 3d 30  ce;. ..  for(i=0
14900 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29  ; i<sizeof(aCmd)
14910 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29  /sizeof(aCmd[0])
14920 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
14930 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
14940 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e  terp, aCmd[i].zN
14950 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72  ame, aCmd[i].xPr
14960 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  oc, 0, 0);.  }. 
14970 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
14980 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65  of(aObjCmd)/size
14990 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20  of(aObjCmd[0]); 
149a0 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
149b0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
149c0 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69  nterp, aObjCmd[i
149d0 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
149e0 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72    aObjCmd[i].xPr
149f0 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63  oc, aObjCmd[i].c
14a00 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20  lientData, 0);. 
14a10 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72   }.  Tcl_LinkVar
14a20 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
14a30 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20  _search_count", 
14a40 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
14a50 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
14a60 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
14a70 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
14a80 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
14a90 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a  e_sort_count", .
14aa0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
14ab0 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
14ac0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
14ad0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
14ae0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69  nterp, "sqlite_i
14af0 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c  nterrupt_count",
14b00 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
14b10 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
14b20 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
14b30 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
14b40 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
14b50 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
14b60 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
14b70 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
14b80 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20  pen_file_count, 
14b90 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
14ba0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
14bb0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72  erp, "sqlite_cur
14bc0 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20  rent_time", .   
14bd0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
14be0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c  e3_current_time,
14bf0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
14c00 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
14c10 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73  terp, "sqlite_os
14c20 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
14c30 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
14c40 73 5f 74 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  s_trace, TCL_LIN
14c50 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
14c60 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
14c70 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
14c80 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20  d_value",.      
14c90 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
14ca0 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
14cb0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
14cc0 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
14cd0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
14ce0 65 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  e_temp_directory
14cf0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
14d00 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  &sqlite3_temp_di
14d10 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e  rectory, TCL_LIN
14d20 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c  K_STRING);.  Tcl
14d30 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
14d40 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c   "bitmask_size",
14d50 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 62  .      (char*)&b
14d60 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c  itmask_size, TCL
14d70 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49  _LINK_INT|TCL_LI
14d80 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20  NK_READ_ONLY);. 
14d90 20 73 65 74 5f 6f 70 74 69 6f 6e 73 28 69 6e 74   set_options(int
14da0 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
14db0 43 4c 5f 4f 4b 3b 0a 7d 0a                       CL_OK;.}.